Postgres 9.2 ou posterior geralmente é inteligente o suficiente para perceber que a condição
WHERE name LIKE '%%'
não é seletivo e recorre a uma varredura sequencial ignorando o índice GiST - mesmo com instruções preparadas. Você faz pagar um pequeno preço pela condição inútil, no entanto.
No Postgres 9.1 ou anterior eu construiria uma consulta separada para o caso especial.
Compare as Observações seção para o
PREPARE
declaração no manual para as versões 9.1
, 9.2
e 9.3
. Verifique-se
Prepare a instrução e execute
EXPLAIN ANALYZE
testar:PREPARE plan1 (text) AS
SELECT * FROM file
WHERE name LIKE $1;
EXPLAIN ANALYZE EXECUTE plan1('%123%');
EXPLAIN ANALYZE EXECUTE plan1('%%');
Os planos geralmente são armazenados em cache durante a sessão.
Consulta alternativa
Independentemente da versão que você está executando, se você sempre realiza uma pesquisa de texto completo (curingas à esquerda e à direita), essa consulta deve ser mais rápida para uma instrução preparada:
SELECT * FROM files WHERE name LIKE ('%' || $1 || '%');
E passe o padrão sem curingas adicionados (
%
), é claro. Dessa forma, o Postgres sabe esperar um padrão entre curingas no momento do planejamento. ->Demonstração do SQLfiddle.
Observe a varredura seqüencial para o LIKE vazio e a diferença de desempenho entre os dois planos.
SQLfiddle varia muito, dependendo da carga etc. Uma única execução pode não ser confiável. Teste melhor em seu ambiente e execute cada instrução algumas vezes para saturar o cache e eliminar o ruído.