PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL não usa um índice parcial


Um índice parcial é uma boa ideia para excluir metade das linhas da tabela que você obviamente não precisa. Mais simples:
CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;

Certifique-se de executar ANALYZE table depois de criar o índice. (O Autovacuum faz isso automaticamente depois de algum tempo se você não fizer isso manualmente, mas se você testar logo após a criação, seu teste falhará.)

Então, para convencer o planejador de consultas de que um índice parcial específico pode ser usado, repita o WHERE condição na consulta - mesmo que pareça completamente redundante:
SELECT col1,col2, .. colN
FROM   table 
WHERE  text_col = 'my_value'
AND   text_col IS NOT NULL;  -- repeat condition

Voilá.

Por documentação:

No entanto, lembre-se de que o predicado deve corresponder às condições usadas nas consultas que devem se beneficiar do índice. Para ser preciso, um índice parcial pode ser usado em uma consulta somente se o sistema puder reconhecer que o WHERE condição da consulta implica matematicamente o predicado do índice. O PostgreSQL não possui um provador de teoremas sofisticado que possa reconhecer expressões matematicamente equivalentes escritas em diferentes formas. (Além de ser um provador de teorema geral extremamente difícil de criar, provavelmente seria muito lento para ser de qualquer uso real.) O sistema pode reconhecer implicações de desigualdade simples, por exemplo, "x <1" implica "x <2"; caso contrário, o predicado a condição deve corresponder exatamente a parte do WHERE da consulta ou o índice não será reconhecido como utilizável. A correspondência ocorre no tempo de planejamento da consulta, não no tempo de execução. Como resultado, as cláusulas de consulta parametrizada não funcionam com um índice parcial.

Quanto às consultas parametrizadas:novamente, adicione o predicado (redundante) do índice parcial como uma constante adicional WHERE condição, e ele funciona muito bem.

Uma atualização importante no Postgres 9.6 melhora muito as chances de verificações somente de índice (o que pode tornar as consultas mais baratas e o planejador de consultas escolherá mais prontamente esses planos de consulta). Relacionado:
  • PostgreSQL não usa índice durante contagem(*)