Postgres 9.2 eller nyere er generelt smart nok til at indse, at tilstanden
WHERE name LIKE '%%'
er ikke selektiv og tyr til en sekventiel scanning, der ignorerer GiST-indekset - selv med forberedte udsagn. Du gør betale en lille pris for den ubrugelige tilstand, dog.
I Postgres 9.1 eller tidligere ville jeg bygge en separat forespørgsel til det specielle tilfælde.
Sammenlign Noter afsnittet for PREPARE
erklæring i manualen til versionerne 9.1
, 9.2
og 9.3
.
Bekræft dig selv
Forbered sætningen og kør EXPLAIN ANALYZE
at teste:
PREPARE plan1 (text) AS
SELECT * FROM file
WHERE name LIKE $1;
EXPLAIN ANALYZE EXECUTE plan1('%123%');
EXPLAIN ANALYZE EXECUTE plan1('%%');
Planer cachelagres generelt i sessionens varighed.
Alternativ forespørgsel
Uanset hvilken version du kører, hvis du altid udfører en fuldtekstsøgning (jokertegn til venstre og højre), skulle denne forespørgsel være hurtigere for en forberedt erklæring:
SELECT * FROM files WHERE name LIKE ('%' || $1 || '%');
Og send mønsteret uden tilføjede jokertegn (%
), selvfølgelig. På denne måde ved Postgres at forvente et mønster omgivet af jokertegn på planlægningstidspunktet.
->SQLfiddle-demo.
Bemærk den sekventielle scanning for den tomme LIKE og ydeevneforskellen mellem de to planer.
SQLfiddle varierer meget, afhængigt af belastning osv. En enkelt kørsel er muligvis ikke pålidelig. Test bedre i dit miljø, og kør hver sætning et par gange for at mætte cachen og eliminere støj.