Odpowiedź zależy od wielu czynników, takich jak wersja Postgresa, kodowanie i lokalizacja — LC_COLLATE w szczególności.
Samo wyrażenie lower(description) LIKE '%abc%' jest zazwyczaj nieco szybszy niż description ILIKE '%abc%' , a oba są nieco szybsze niż równoważne wyrażenie regularne:description ~* 'abc' . Ma to znaczenie w przypadku skanowań sekwencyjnych, w których wyrażenie musi zostać ocenione dla każdego testowanego wiersza.
Ale w przypadku dużych tabel, które pokazujesz w swojej odpowiedzi, z pewnością użyjesz indeksu. W przypadku dowolnych wzorców (nie tylko zakotwiczonych w lewo) proponuję indeks trygramów za pomocą dodatkowego modułu pg_trgm . Następnie mówimy o milisekundach zamiast sekundach, a różnica między powyższymi wyrażeniami jest zerowana.
Indeksy GIN i GiST (przy użyciu gin_trgm_ops lub gist_trgm_ops klasy operatorów) obsługują LIKE (~~ ), ILIKE (~~* ), ~ , ~* (i kilka innych wariantów). Z trygramowym indeksem GIN na description (zwykle większe niż GiST, ale szybsze w przypadku odczytów), w zapytaniu użyto by description ILIKE 'case_insensitive_pattern' .
Powiązane:
- Odmiany wydajności zapytań PostgreSQL LIKE
- Podobne ciągi UTF-8 dla pola autouzupełniania
Podstawy dopasowywania wzorców w Postgresie:
- Dopasowywanie wzorców za pomocą LIKE, SIMILAR TO lub wyrażeń regularnych w PostgreSQL
Podczas pracy ze wspomnianym indeksem trygramów jest zazwyczaj bardziej praktyczne w pracy z:
description ILIKE '%abc%'
Lub z operatorem regexp niewrażliwym na wielkość liter (bez % symbole wieloznaczne):
description ~* 'abc'
Indeks na (description) nie obsługuje zapytań na lower(description) jak:
lower(description) LIKE '%abc%'
I wzajemnie.
Z predykatami na lower(description) wyłącznie , indeks wyrażenia jest nieco lepszą opcją.
We wszystkich innych przypadkach indeks (description) jest preferowany, ponieważ obsługuje oba predykaty rozróżniające wielkość liter i -niewrażliwe.