11.5. Combinação de vários índices #

Uma varredura de índice único pode usar apenas cláusulas de consulta que usam as colunas do índice com operadores de sua classe de operadores, e são unidas com AND. Por exemplo, dado um índice em (a, b), uma condição de consulta WHERE a = 5 AND b = 6 pode usar o índice, mas uma consulta WHERE a = 5 OR b = 6 não pode usar o índice diretamente.

Felizmente, o PostgreSQL consegue combinar vários índices (incluindo vários usos do mesmo índice), para lidar com casos que não podem ser resolvidos por varreduras de índice único. O sistema pode formar condições AND e OR através de várias varreduras de índice. Por exemplo, uma consulta como WHERE x = 42 OR x = 47 OR x = 53 OR x = 99 pode ser dividida em quatro varreduras separadas de um índice em x, com cada varredura usando uma das cláusulas da consulta. Os resultados destas varreduras são então combinados usando OR para produzir o resultado. Outro exemplo, se houver índices separados em x e y, uma possível resolução de uma consulta como WHERE x = 5 AND y = 6 seria usar cada índice com a cláusula de consulta apropriada e, depois, combinar os diferentes resultados dos índices usando AND para identificar as linhas do resultado.

Para combinar vários índices, o sistema varre cada índice necessário e prepara um bitmap na memória que fornece a localização das linhas da tabela que correspondem às condições do índice. Os bitmaps são depois combinados usando AND e OR, conforme seja necessário para a consulta. Finalmente, as linhas reais da tabela são acessadas e retornadas. As linhas da tabela são acessadas na ordem física, porque é assim que o bitmap é criado; isto significa que a ordem dos índices originais é perdida, portanto, será necessária uma etapa de classificação separada se a consulta incluir a cláusula ORDER BY. Por este motivo, e por que cada varredura de índice adicional acrescenta tempo extra, o planejador às vezes opta por usar uma varredura de índice único, mesmo havendo índices adicionais disponíveis que também poderiam ter sido usados.

Em todas as aplicações, exceto nas mais simples, existem várias combinações de índices que podem ser úteis, e o desenvolvedor do banco de dados deve fazer escolhas para decidir quais índices oferecer. Às vezes, os índices multicoluna são melhores, mas às vezes é melhor criar índices separados e contar com o recurso de combinação de índices. Por exemplo, se a carga de trabalho incluir uma combinação de consultas que envolvem às vezes apenas a coluna x, às vezes apenas a coluna y, e às vezes as duas colunas, pode-se optar por criar dois índices separados em x e y, contando com a combinação de índices para processar as consultas que usam as duas colunas. Também pode ser criado um índice multicoluna em (x, y). Este índice normalmente seria mais eficiente que a combinação de índices para consultas envolvendo as duas colunas, mas conforme discutido na Seção 11.3, reria menos útil para consultas que envolvam apenas y. O quanto será útil irá dependerá da eficácia da otimização da varredura de saltos do índice B-tree; Se x não tiver mais do que algumas centenas de valores distintos, a varredura de salto fará com que as procuras por valores específicos de y sejam executadas de forma razoavelmente eficiente. Uma combinação de um índice de múltiplas colunas em (x, y) e um índice separado em y também pode funcionar razoavelmente bem. Para consultas envolvendo apenas x, o índice de múltiplas colunas pode ser usado, embora seja maior e, portanto, mais lento do que um índice apenas em x. A última alternativa seria criar os três índices, mas isto provavelmente só será razoável se a tabela for procurada com muito mais frequência do que atualizada e se os três tipos de consulta forem comuns. Se um dos tipos de consulta for muito menos comum do que os outros, você provavelmente se contentaria em criar apenas os dois índices que melhor correspondem aos tipos comuns.