Documentation PostgreSQL 8.0.25 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 11. Index | Avance rapide | Suivant |
Une définition d'index peut indiquer une classe d'opérateurs pour chaque colonne de l'index.
CREATE INDEX name ON table (column opclass [, ...]);
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 ordinaires 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) si 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);
Si vous utilisez la localisation C, vous pouvez à la place créer un index avec la classe d'opérateurs par défaut, qui sera utilisable pour les recherches de motifs. Notez aussi 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.
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.oprname 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;
Précédent | Sommaire | Suivant |
Index sur des expressions | Niveau supérieur | Index partiels |