sql >> Databáze >  >> RDS >> PostgreSQL

LOWER LIKE vs. ILIKE

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.



  1. cx oracle ImportError

  2. ISDATE() Příklady v SQL Server

  3. Získejte název zdrojové tabulky řádku při dotazu na nadřazený řádek, od kterého dědí

  4. Jak číst číslo verze z databázového souboru v Androidu, který je umístěn ve složce aktiv