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 oWHERE
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 doWHERE
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(*)