Embora no PostgreSQL os índices não necessitem de manutenção e ajuste, ainda assim é importante verificar quais índices são utilizados realmente pelos comandos executados no ambiente de produção. O exame da utilização de um índice por um determinado comando é feito por meio do comando EXPLAIN; sua aplicação para esta finalidade está ilustrada na Seção 13.1. Também é possível coletar estatísticas gerais sobre a utilização dos índices por um servidor em operação da maneira descrita na Seção 23.2.
É difícil formular um procedimento genérico para determinar quais índices devem ser definidos. Existem vários casos típicos que foram mostrados nos exemplos das seções anteriores. Muita verificação experimental é necessária na maioria dos casos. O restante desta seção dá algumas dicas.
O comando ANALYZE sempre deve ser executado primeiro. Este comando coleta estatísticas sobre a distribuição dos valores na tabela. Esta informação é necessária para estimar o número de linhas retornadas pela consulta, que é uma necessidade do planejador para atribuir custos dentro da realidade para cada plano de comando possível. Na ausência de estatísticas reais, são assumidos alguns valores padrão, quase sempre imprecisos. O exame da utilização do índice pelo aplicativo 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 definir índices diz quais índices são necessários para os dados de teste, e nada além disso.
É especialmente fatal utilizar conjuntos de dados de teste muito pequenos. Enquanto selecionar 1.000 de cada 100.000 linhas pode ser um candidato para um índice, selecionar 1 de cada 100 linhas dificilmente será, porque as 100 linhas provavelmente cabem dentro de uma única página do disco, e não existe nenhum plano melhor que uma busca seqüencial em uma página do disco.
Também deve ser tomado cuidado ao produzir os dados de teste, geralmente não disponíveis quando o aplicativo ainda não se encontra 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 devem ter.
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 Seção 16.4). Por exemplo, desativar varreduras seqüenciais (enable_seqscan) e junções de laço-aninhado (enable_nestloop), que são os planos mais básicos, forçam o sistema a utilizar um plano diferente. Se o sistema ainda assim 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 corresponde ao índice (Qual tipo de consulta pode utilizar qual tipo de índice é explicado nas seções anteriores).
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 realmente a utilização do índice não é apropriada, ou a estimativa de custo dos planos de comando 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 do nó do plano. Os custos dos nós do plano podem ser ajustados usando parâmetros em tempo de execução (descritos no Seção 16.4). A estimativa imprecisa da seletividade é devida a estatísticas insuficientes. É possível melhorar esta situação ajustando os parâmetros de captura de estatísticas (consulte o comando ALTER TABLE).
Se não for obtido sucesso no ajuste dos custos para ficarem mais apropriados, então pode ser necessário o recurso de forçar a utilização do índice explicitamente. Pode-se, também, desejar fazer contato com os desenvolvedores do PostgreSQL para examinar este problema.