sql >> Database >  >> RDS >> PostgreSQL

LAGER LIKE vs iLIKE

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.



  1. Is het echt nodig om elke keer dat de applicatie start SQLite-tabellen te maken?

  2. MySQL Query om gegevens van vorige week te selecteren?

  3. ORACLE en TRIGGERS (ingevoegd, bijgewerkt, verwijderd)

  4. Hoe Glassfish Server handmatig in Eclipse te configureren