web-dev-qa-db-fra.com

Pourquoi voudriez-vous indexer text_pattern_ops sur une colonne de texte?

Aujourd'hui Sept bases de données en sept semaines m'a présenté les index par opérateur.

Vous pouvez indexer des chaînes pour un modèle correspondant aux requêtes précédentes en créant un text_pattern_ops index de classe d'opérateur, tant que les valeurs sont indexées en minuscules.

CREATE INDEX moves_title_pattern ON movies (
    (lower(title) text_pattern_ops);

Nous avons utilisé le text_pattern_ops car le titre est de type texte. Si vous devez indexer des varchars, des caractères ou des noms, utilisez les opérations associées: varchar_pattern_ops, bpchar_pattern_ops, et name_pattern_ops.

Je trouve l'exemple vraiment déroutant. Pourquoi est-il utile de faire cela?

Si la colonne est de type texte, les autres types (varchar, char, name) ne seraient-ils pas convertis en texte avant d'être utilisés comme valeur de recherche?

Comment cet index se comporte-t-il différemment de celui utilisant l'opérateur par défaut?

CREATE INDEX moves_title_pattern ON movies (lower(title));
20

La documentation vous donne souvent une réponse à ces questions. Comme dans dans ce cas , aussi:

Les classes d'opérateur text_pattern_ops, varchar_pattern_ops et bpchar_pattern_ops prennent en charge les index B-tree sur les types text, varchar et char respectivement. La différence avec les classes d'opérateurs par défaut est que les valeurs sont comparées strictement caractère par caractère plutôt qu'en fonction des règles de classement spécifiques aux paramètres régionaux. Cela rend ces classes d'opérateurs utilisables par les requêtes impliquant des expressions de correspondance de modèle (expressions régulières LIKE ou POSIX) lorsque la base de données n'utilise pas le standard "C" lieu. Par exemple, vous pouvez indexer une colonne varchar comme ceci:

CREATE INDEX test_index ON test_table (col varchar_pattern_ops);

Notez que vous devez également créer un index avec la classe d'opérateur par défaut si vous voulez des requêtes impliquant des comparaisons ordinaires <, <=,> ou> = pour utiliser un index. Ces requêtes ne peuvent pas utiliser les classes d'opérateur xxx_pattern_ops . (Les comparaisons d'égalité ordinaires peuvent toutefois utiliser ces classes d'opérateurs.) Il est possible de créer plusieurs index sur la même colonne avec différentes classes d'opérateurs.

La documentation poursuit en disant:

Si vous utilisez les paramètres régionaux C, vous n'avez pas besoin des classes d'opérateur xxx_pattern_ops, car un index avec la classe d'opérateur par défaut est utilisable pour les requêtes de correspondance de modèle dans les paramètres régionaux C.

Vous pouvez vérifier vos paramètres régionaux comme suit (il s'agit probablement d'UTF8 plutôt que de "C"):

postgres=> show lc_collate;
 lc_collate
-------------
 en_GB.UTF-8
21
dezso