CREATE INDEX

Nom

CREATE INDEX -- définit un nouvel index

Synopsis

CREATE [ UNIQUE ] INDEX nom ON table [ USING méthode ]
    ( { colonne | ( expression ) } [ classeop ] [, ...] )
    [ WHERE prédicat ]

Description

CREATE INDEX construit un index nom_index sur la table spécifiée. Les index sont principalement utilisés pour améliorer les performances de la base de données (bien qu'une utilisation inappropriée résultera en des performances moindres).

Les champs clé pour l'index sont spécifiés par les noms des colonnes ou comme des expressions écrites entre parenthèses. Plusieurs champs peuvent être spécifiés si la méthode d'indexage supporte les index multi-colonnes.

Un champ index peut être une expression calculée à partir des valeurs d'une ou plusieurs colonnes d'une ligne d'une table. Cette fonctionnalité peut être utilisée pour obtenir un accès rapide aux données basées sur quelques transformations des données basiques. Par exemple, un index calculé sur upper(col) permettra l'utilisation d'un index par WHERE upper(col) = 'JIM'.

PostgreSQL fournit les méthodes d'indexage B-tree, R-tree, hash et GiST. La méthode d'indexage B-tree est une implémentation des arbres balancées à haute concurrence de Lehman-Yao. La méthode d'indexage R-tree implémente les R-tree en utilisant l'algorithme divisé quadratique de Guttman. La méthode d'indexage hash est une implémentation du découpage linaire de Litwin. Les utilisateurs peuvent aussi définir leur propre méthode d'indexage mais ceci est particulièrement compliqué.

Lorsque la clause WHERE est présente, un index partiel est créé. Un index partiel est un index contenant des entrées pour seulement une portion d'une table, habituellement une portion qui est un peu plus intéressante que le reste de la table. Par exemple, si vous disposez d'une table contenant des ordres facturés et non facturés où les ordres non facturés prennent une petite fraction du total de la table et qu'il s'agit en plus d'une section fréquemment utilisée, vous pouvez améliorer les performances en créant un index sur cette portion. Une autre application possible est d'utiliser WHERE avec UNIQUE pour renforcer l'unicité sur un sous-ensemble d'une table.

L'expression utilisée dans la clause WHERE pourrait référencer seulement les colonnes de la table sous-jacente (mais il peut utiliser toute les colonnes, pas seulement celles en cours d'indexage). Actuellement, les sous-requêtes et les expressions d'agrégats sont aussi interdites dans WHERE. Les mêmes restrictions s'appliquent aux champs d'index qui sont des expressions.

Toutes les fonctions et opérateurs utilisés dans la définition d'index doivent être << immutable >>, c'est-à-dire que leur résultat doit uniquement dépendre de leurs arguments et jamais d'une influence externe (telle que le contenu d'une autre table ou l'heure actuelle). Cette restriction permet de s'assurer que le comportement de l'index est bien défini. Pour utiliser une fonction définie par l'utilisateur dans une expression d'index ou dans une clause WHERE, rappelez-vous de marquer la fonction comme immutable lorsque vous la créez.

Paramètres

UNIQUE

Fait que le système vérifie les valeurs dupliquées dans la table à la création de l'index (si des données existent déjà) et à chaque fois qu'une donnée est ajoutée. Les tentatives d'insertion ou de mises à jour qui résulteraient en des entrées dupliquées généreront une erreur.

nom

Le nom de l'index à créer. Aucun nom de schéma ne peut être inclus ici ; l'index est toujours créé dans le même schéma que sa table parent.

table

Le nom de la table à indexer (pouvant être qualifié du nom du schéma).

méthode

Le nom de la méthode à utiliser pour l'index. Les choix sont btree, hash, rtree et gist. La méthode par défaut est btree.

colonne

Le nom d'une colonne de la table.

expression

Une expression basée sur une ou plusieurs colonnes de la table. L'expression doit habituellement être écrite en l'entourant de parenthèses, comme le montre la syntaxe. Néanmoins, les parenthèses peuvent être oubliées si l'expression est de la forme d'un appel de fonction.

classeop

Le nom d'une classe d'opérateur. Voir ci-dessous pour les détails.

prédicat

L'expression de contrainte pour un index partiel.

Notes

Voir Chapitre 11 pour des informations sur le moment où les index sont utilisés, quand ils ne le sont pas et dans quelles situations particulières ils peuvent être utiles.

Actuellement, seules les méthodes d'indexage B-tree et GiST supportent les index multi-colonnes. Jusqu'à 32 champs peuvent être spécifiés par défaut. (Cette limite peut être modifiée lors de la construction de PostgreSQL.) Seul B-tree supporte actuellement les index uniques.

Une classe d'opérateur peut être spécifiée pour chaque colonne d'un index. La classe d'opérateur identifie les opérateurs à utiliser par l'index pour cette colonne. Par exemple, un index B-tree sur des entiers sur quatre octets utiliserait la classe int4_ops ; cette classe d'opérateur inclut des fonctions de comparaison pour les entiers sur quatre octets. En pratique, la classe d'opérateur par défaut pour le type de données de la colonne est généralement suffisant. Le point principal pour avoir des classes d'opérateur est que pour certains types de données, il pourrait y avoir plus d'un ordonnancement significatif. Par exemple, nous pourrions vouloir trier un type de données << nombre complexe >> soit par sa valeur absolue soit par sa partie réelle. Nous pourrions le faire en définissant deux classes d'opérateur pour le type de données, puis en sélectionnant la bonne classe lors de la création d'un index. Plus d'informations sur les classes d'opérateurs sont disponibles dans Section 11.6 et dans Section 33.13.

Utilisez DROP INDEX pour supprimer un index.

Exemples

Pour créer un index B-tree sur la colonne titre dans la table films :

CREATE UNIQUE INDEX title_idx ON films (title);

Compatibilité

CREATE INDEX est une extension du langage PostgreSQL. Les index n'existent pas dans le standard SQL.