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

MI PIACE INFERIORE vs MI PIACE

La risposta dipende da molti fattori come la versione di Postgres, la codifica e le impostazioni locali:LC_COLLATE in particolare.

L'espressione nuda lower(description) LIKE '%abc%' è in genere un po' più veloce della description ILIKE '%abc%' , ed è un po' più veloce dell'equivalente espressione regolare:description ~* 'abc' . Questo è importante per le scansioni sequenziali in cui l'espressione deve essere valutata per ogni riga testata.

Ma per grandi tabelle come dimostri nella tua risposta si userebbe sicuramente un indice. Per pattern arbitrari (non solo ancorati a sinistra) suggerisco un indice di trigramma usando il modulo aggiuntivo pg_trgm . Quindi si parla di millisecondi invece di secondi e la differenza tra le espressioni di cui sopra è annullata.

Indici GIN e GiST (usando il gin_trgm_ops o gist_trgm_ops classi operatore) supportano LIKE (~~ ), ILIKE (~~* ), ~ , ~* (e alcune altre varianti) allo stesso modo. Con un indice GIN del trigramma su description (in genere più grande di GiST, ma più veloce per le letture), la tua query userebbe description ILIKE 'case_insensitive_pattern' .

Correlati:

  • Variazioni delle prestazioni delle query LIKE di PostgreSQL
  • Stringhe UTF-8 simili per il campo di completamento automatico

Nozioni di base per la corrispondenza dei modelli in Postgres:

  • Corrispondenza del modello con LIKE, SIMILAR TO o espressioni regolari in PostgreSQL

Quando si lavora con detto indice di trigramma è tipicamente più pratico con cui lavorare:

description ILIKE '%abc%'

O con l'operatore regexp senza distinzione tra maiuscole e minuscole (senza % caratteri jolly):

description ~* 'abc'

Un indice su (description) non supporta le query su lower(description) come:

lower(description) LIKE '%abc%'

E viceversa.

Con predicati su lower(description) esclusivamente , l'indice dell'espressione è l'opzione leggermente migliore.

In tutti gli altri casi, un indice su (description) è preferibile in quanto supporta entrambi predicati con distinzione tra maiuscole e minuscole e senza distinzione tra maiuscole e minuscole.