11.9. Classes et familles 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  [options de tri][, ...]);

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. La classe d'opérateur détermine l'ordre de tri basique (qui peut ensuite être modifié en ajoutant des options de tri comme ASC/DESC et/ou NULLS FIRST/NULLS LAST).

Il y a quelques classes d'opérateurs en plus des classes par défaut:

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.opcmethod = am.oid
    ORDER BY index_method, opclass_name;

Une classe d'opérateur est seulement un sous-ensemble d'une structure plus large appelée famille d'opérateur. Dans les cas où plusieurs types de données ont des comportements similaires, il est utile fréquemment de définir des opérateurs identiques pour plusieurs types de données et d'autoriser leur utilisation avec des index. Pour cela, les classes d'opérateur de chacun de ces types doivent être groupés dans la même famille d'opérateurs. Les opérateurs inter-types sont membres de la famille mas ne sont pas associés avec une seule classe de la famille.

Cette requête affiche toutes les familles d'opérateur définies et tous les opérateurs inclus dans chaque famille :

SELECT am.amname AS index_method,
       opf.opfname AS opfamily_name,
       amop.amopopr::regoperator AS opfamily_operator
    FROM pg_am am, pg_opfamily opf, pg_amop amop
    WHERE opf.opfmethod = am.oid AND
          amop.amopfamily = opf.oid
    ORDER BY index_method, opfamily_name, opfamily_operator;