Odpověď závisí na mnoha faktorech, jako je verze Postgres, kódování a národní prostředí - LC_COLLATE
konkrétně.
Holý výraz lower(description) LIKE '%abc%'
je obvykle o něco rychlejší než description ILIKE '%abc%'
a oba jsou o něco rychlejší než ekvivalentní regulární výraz:description ~* 'abc'
. To je důležité pro sekvenční skenování, kde musí být výraz vyhodnocen pro každý testovaný řádek.
Ale pro velké tabulky, jaké demonstrujete ve své odpovědi, by se určitě použil index. Pro libovolné vzory (nejen ukotvené vlevo) navrhuji index trigramu pomocí dodatečného modulu pg_trgm
. Pak mluvíme o milisekundách místo sekund a rozdíl mezi výše uvedenými výrazy je vynulován.
Indexy GIN a GiST (pomocí gin_trgm_ops
nebo gist_trgm_ops
třídy operátorů) podporují ILIKE
(~~
), ILIKE
(~~*
), ~
, ~*
(a některé další varianty) podobně. S trigramovým GIN indexem v description
(obvykle větší než GiST, ale rychlejší pro čtení), váš dotaz by použil description ILIKE 'case_insensitive_pattern'
.
Související:
- Varianty výkonu dotazů PostgreSQL LIKE
- Podobné řetězce UTF-8 pro pole automatického doplňování
Základy pro porovnávání vzorů v Postgres:
- Shoda vzoru s LIKE, SIMILAR TO nebo regulárními výrazy v PostgreSQL
Při práci s uvedeným trigramovým indexem je to typicky praktičtější pracovat:
description ILIKE '%abc%'
Nebo s operátorem regulárního výrazu bez rozlišení velkých a malých písmen (bez %
zástupné znaky):
description ~* 'abc'
Index na (description)
nepodporuje dotazy na lower(description)
jako:
lower(description) LIKE '%abc%'
A naopak.
S predikáty na lower(description)
výhradně , výraz index je o něco lepší možnost.
Ve všech ostatních případech index na (description)
je vhodnější, protože podporuje obojí predikáty rozlišující malá a velká písmena.