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

Impatto sulle prestazioni di LIKE vuoto in una dichiarazione preparata

Postgres 9.2 o versioni successive è generalmente abbastanza intelligente da rendersi conto che la condizione

WHERE name LIKE '%%'

non è selettivo e ricorre a una scansione sequenziale ignorando l'indice GiST, anche con istruzioni preparate. Tu fai pagare un piccolo prezzo per la condizione inutile, però.

In Postgres 9.1 o versioni precedenti creerei una query separata per il caso speciale.

Confronta le Note sezione per il PREPARE dichiarazione nel manuale per le versioni 9.1 , 9.2 e 9.3 .

Verificati

Prepara la dichiarazione ed esegui EXPLAIN ANALYZE per testare:

PREPARE plan1 (text) AS
SELECT  * FROM file
WHERE   name LIKE $1;

EXPLAIN ANALYZE EXECUTE plan1('%123%');

EXPLAIN ANALYZE EXECUTE plan1('%%');

I piani vengono generalmente memorizzati nella cache per la durata della sessione.

Richiesta alternativa

Indipendentemente dalla versione in esecuzione, se esegui sempre una ricerca di testo completo (caratteri jolly a sinistra e a destra), questa query dovrebbe essere più veloce per un'istruzione preparata:

SELECT * FROM files WHERE name LIKE ('%' || $1 || '%');

E passa il modello senza aggiungere caratteri jolly (% ), Certo. In questo modo, Postgres sa di aspettarsi uno schema racchiuso tra caratteri jolly al momento della pianificazione.

->Demo SQLfiddle.
Nota la scansione sequenziale per il LIKE vuoto e la differenza di prestazioni tra i due piani.
SQLfiddle varia molto, a seconda del carico e così via. Una singola esecuzione potrebbe non essere affidabile. Prova meglio nel tuo ambiente ed esegui ogni istruzione un paio di volte per saturare la cache ed eliminare il rumore.