La réponse dépend de nombreux facteurs tels que la version de Postgres, l'encodage et les paramètres régionaux - LC_COLLATE
en particulier.
L'expression nue lower(description) LIKE '%abc%'
est généralement un peu plus rapide que description ILIKE '%abc%'
, et l'une ou l'autre est un peu plus rapide que l'expression régulière équivalente :description ~* 'abc'
. Cela est important pour les analyses séquentielles où l'expression doit être évaluée pour chaque ligne testée.
Mais pour les grandes tables comme vous le démontrez dans votre réponse, on utiliserait certainement un index. Pour les modèles arbitraires (pas seulement ancrés à gauche), je suggère un index de trigramme en utilisant le module supplémentaire pg_trgm
. On parle alors de millisecondes au lieu de secondes et la différence entre les expressions ci-dessus est annulée.
Index GIN et GiST (en utilisant le gin_trgm_ops
ou gist_trgm_ops
classes d'opérateurs) prennent en charge LIKE
(~~
), ILIKE
(~~*
), ~
, ~*
(et quelques autres variantes) identiques. Avec un index trigramme GIN sur description
(généralement plus gros que GiST, mais plus rapide pour les lectures), votre requête utiliserait description ILIKE 'case_insensitive_pattern'
.
Connexe :
- Variations des performances des requêtes PostgreSQL LIKE
- Chaînes UTF-8 similaires pour le champ de saisie semi-automatique
Principes de base pour la correspondance de modèles dans Postgres :
- Mise en correspondance de modèles avec LIKE, SIMILAR TO ou des expressions régulières dans PostgreSQL
Lorsque vous travaillez avec ledit index de trigramme, c'est généralement plus pratique à utiliser :
description ILIKE '%abc%'
Ou avec l'opérateur regexp insensible à la casse (sans %
caractères génériques) :
description ~* 'abc'
Un index sur (description)
ne prend pas en charge les requêtes sur lower(description)
comme :
lower(description) LIKE '%abc%'
Et vice versa.
Avec des prédicats sur lower(description)
exclusivement , l'expression index est l'option légèrement meilleure.
Dans tous les autres cas, un index sur (description)
est préférable car il prend en charge les deux prédicats sensibles à la casse et insensibles à la casse.