Het antwoord hangt af van veel factoren, zoals Postgres-versie, codering en landinstelling - LC_COLLATE
in het bijzonder.
De kale uitdrukking lower(description) LIKE '%abc%'
is meestal een beetje sneller dan description ILIKE '%abc%'
, en beide zijn iets sneller dan de equivalente reguliere expressie:description ~* 'abc'
. Dit is van belang voor opeenvolgende scans waarbij de uitdrukking moet worden geëvalueerd voor elke geteste rij.
Maar voor grote tabellen zoals je in je antwoord laat zien, zou je zeker een index gebruiken. Voor willekeurige patronen (niet alleen links verankerd) stel ik een trigramindex voor met behulp van de extra module pg_trgm
. Dan praten we over milliseconden in plaats van seconden en wordt het verschil tussen de bovenstaande uitdrukkingen teniet gedaan.
GIN- en GiST-indexen (met behulp van de gin_trgm_ops
of gist_trgm_ops
operatorklassen) ondersteunen LIKE
(~~
), ILIKE
(~~*
), ~
, ~*
(en nog enkele varianten) hetzelfde. Met een trigram GIN-index op description
(meestal groter dan GiST, maar sneller voor lezen), uw zoekopdracht zou description ILIKE 'case_insensitive_pattern'
gebruiken .
Gerelateerd:
- PostgreSQL LIKE prestatievariaties voor query's
- Vergelijkbare UTF-8-tekenreeksen voor automatisch aanvullen-veld
Basisprincipes voor patroonherkenning in Postgres:
- Patroon komt overeen met LIKE, VERGELIJKBAAR MET of reguliere expressies in PostgreSQL
Als je met de trigram-index werkt, is het meestal praktischer om mee te werken:
description ILIKE '%abc%'
Of met de hoofdletterongevoelige regexp-operator (zonder %
jokertekens):
description ~* 'abc'
Een index op (description)
ondersteunt geen zoekopdrachten op lower(description)
zoals:
lower(description) LIKE '%abc%'
En vice versa.
Met predikaten op lower(description)
exclusief , de expressie-index is de iets betere optie.
In alle andere gevallen een index op (description)
heeft de voorkeur omdat het beide . ondersteunt hoofdlettergevoelige en -ongevoelige predikaten.