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

Impacto no desempenho de LIKE vazio em uma instrução preparada


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.