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.