sql >> Database teknologi >  >> RDS >> PostgreSQL

Ydeevnepåvirkning af tom LIKE i en udarbejdet erklæring

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.




  1. Bestil versioner som tal

  2. videregive heltalsarray til oracle-procedure med c#

  3. MYSQL PHP-opdateringsdata for hver række

  4. I MySQL er det muligt at få mere end 1024 tegn tilbage fra GROUP_CONCAT