Embora os índices no PostgreSQL não necessitem de manutenção e ajuste, ainda assim é importante verificar quais índices são realmente utilizados no trabalho diário. O exame da utilização dos índices é feito por meio do comando EXPLAIN; sua aplicação para esta finalidade está ilustrada na Seção 10.1.
É difícil formular um procedimento geral para determinar quais índices devem ser criados. Existem vários casos típicos que foram mostrados através de exemplos nas seções anteriores. Muita verificação experimental é necessária na maioria dos casos. O restante desta seção dá algumas dicas para atingir este objetivo.
O comando ANALYZE sempre deve ser executado antes. Este comando coleta estatísticas relativas à distribuição dos valores na tabela. Esta informação é requerida para prever o número de linhas retornadas pela consulta, uma necessidade do planejador para atribuir custos efetivos a cada um dos planos possíveis para a consulta. Na ausência de uma estatística real, alguns valores padrão são pressupostos, sendo geralmente inadequados. O exame da utilização do índice pela aplicação sem a execução prévia do comando ANALYZE é, portanto, uma causa perdida.
Devem ser usados dados reais para a verificação experimental. O uso de dados de teste para criar índices diz quais são os índices necessários para os dados de teste, e nada além disso.
É particularmente fatal utilizar conjuntos de dados proporcionalmente reduzidos. Enquanto a seleção de 1.000 para cada 100.000 linhas pode ajudar a produzir um candidato a índice, a seleção de 1 para cada 100 linhas dificilmente ajudará, porque as 100 linhas provavelmente cabem dentro de uma página do disco, não havendo nenhum plano melhor que uma busca seqüencial em uma única página do disco.
Também deve ser tomado cuidado ao produzir os dados de teste, geralmente não disponíveis quando a aplicação ainda não está em produção. Valores muito semelhantes, completamente aleatórios, ou inseridos ordenadamente, distorcem as estatísticas em relação à distribuição que os dados reais teriam.
Quando os índices não são usados, pode ser útil como teste forçar sua utilização. Existem parâmetros em tempo de execução que podem desativar vários tipos de planos (descritos no Guia do Administrador do PostgreSQL). Por exemplo, desativar varreduras seqüenciais (enable_seqscan) e junções de laço-aninhado (nested-loop joins) (enable_nestloop), que são os planos mais básicos, forçam o sistema a utilizar um plano diferente. Se o sistema ainda escolher a varredura seqüencial ou a junção de laço-aninhado então existe, provavelmente, algum problema mais fundamental devido ao qual o índice não está sendo utilizado como, por exemplo, a condição da consulta não corresponder ao índice (Qual tipo de consulta pode utilizar qual tipo de índice é explicado na seção anterior).
Se forçar a utilização do índice não faz o índice ser usado, então existem duas possibilidades: Ou o sistema está correto e a utilização do índice não é apropriada, ou a estimativa de custo dos planos da consulta não estão refletindo a realidade. Portanto, deve ser medido o tempo da consulta com e sem índices. O comando EXPLAIN ANALYZE pode ser útil neste caso.
Se for descoberto que as estimativas de custo estão erradas existem, novamente, duas possibilidades. O custo total é calculado a partir do custo por linha de cada nó do plano vezes a seletividade estimada de cada nó do plano. Os custos dos nós do plano podem ser ajustados usando parâmetros em tempo de execução (descritos no Guia do Administrador do PostgreSQL). A estimativa imprecisa da seletividade é devida a falta de estatísticas. É possível melhorar esta situação ajustando os parâmetros de captura de estatísticas (veja o comando ALTER TABLE).
Se não for obtido sucesso no ajuste dos custos para ficarem mais apropriados, então pode ser necessário obrigar a utilização do índice explicitamente. Pode-se, também, desejar fazer contato com os desenvolvedores do PostgreSQL para examinar esta questão.