11.8. Classes d'opérateurs
Une définition d'index peut indiquer une classe
d'opérateurs pour chaque colonne de l'index.
CREATE INDEX nom ON table (colonne classe_operateur [, ...]);
La classe d'opérateurs identifie les opérateurs que l'index doit
utiliser sur cette colonne. Par exemple, un index B-tree sur une
colonne de type int4 utiliserait la classe
int4_ops. Cette classe d'opérateurs comprend
des fonctions de comparaison pour les valeurs de type int4. En pratique, la classe d'opérateurs par défaut
pour le type de données de la colonne est généralement suffisant. Les
classes d'opérateurs sont utiles pour certains types de données, pour
lesquels il pourrait y avoir plus d'un comportement utile de l'index.
Par exemple, nous pourrions vouloir trier une donnée de type nombre
complexe soit par sa valeur absolue, soit par sa partie entière. Nous
pourrions le faire en définissant deux classes d'opérateurs pour ce
type de données et en sélectionnant la bonne classe en créant
l'index.
Il y a quelques classes d'opérateurs en plus des classes par défaut:
-
Les classes d'opérateurs text_pattern_ops, varchar_pattern_ops, bpchar_pattern_ops, et name_pattern_ops supportent les index B-tree sur
les types text, varchar, char, et
name, 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 que
suivant les règles de tri spécifiques à la localisation. Cela
rend ces index utilisables pour des requêtes qui utilisent des
recherches sur des motifs (LIKE ou des
expressions régulières POSIX) quand le serveur n'utilise pas la
localisation standard « C ». Par exemple, on pourrait indexer une
colonne varchar comme ceci:
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
Notez qu'il faut créer un index avec la classe d'opérateurs par
défaut si vous voulez que les requêtes qui utilisent une
comparaison ordinaire utilisent un index. De telles requêtes ne
peuvent pas utiliser les classes d'opérateurs
xxx
_pattern_ops. Il est
possible de créer plusieurs index sur la même colonne avec
différentes classes d'opérateurs. Si vous utilisez la locale C,
vous n'avez pas besoin des classes d'opérateur
xxx
_pattern_ops car un index
avec une classe d'opérateur par défaut est utilisable pour les
requêtes de correspondance de modèles dans la locale C.
Les requêtes suivantes montrent toutes les classes d'opérateurs
prédéfinies:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name
FROM pg_am am, pg_opclass opc
WHERE opc.opcamid = am.oid
ORDER BY index_method, opclass_name;
Elle peut être étendue pour montrer tous les opérateurs inclus dans
chaque classe:
SELECT am.amname AS index_method,
opc.opcname AS opclass_name,
opr.oid::regoperator AS opclass_operator
FROM pg_am am, pg_opclass opc, pg_amop amop, pg_operator opr
WHERE opc.opcamid = am.oid AND
amop.amopclaid = opc.oid AND
amop.amopopr = opr.oid
ORDER BY index_method, opclass_name, opclass_operator;