Une colonne d'index ne correspond pas nécessairement exactement à une colonne de la table associée, mais peut être une fonction ou une expression scalaire calculée à partir d'une ou plusieurs colonnes de la table. Cette fonctionnalité est utile pour obtenir un accès rapide aux tables en utilisant les résultats de calculs.
Par exemple, une façon classique de faire des comparaisons indépendantes
de la casse est d'utiliser la fonction lower
:
SELECT * FROM test1 WHERE lower(col1) = 'valeur';
Si un index a été défini sur le résultat de lower(col1)
,
cette requête peut l'utiliser.
Un tel index est créé avec la commande :
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
Si l'index est déclaré UNIQUE
, il empêche
la création de lignes dont les valeurs de la colonne col1
ne
diffèrent que par la casse, ainsi que celle de lignes dont les valeurs de la
colonne col1
sont identiques.
Ainsi, les index d'expressions peuvent être utilisés pour
appliquer des contraintes qui ne peuvent être définies avec une simple
contrainte d'unicité.
Autre exemple. Lorsque des requêtes comme :
SELECT * FROM personnes WHERE (prenom || ' ' || nom) = 'Jean Dupont';
sont fréquentes, alors il peut être utile de créer un index comme :
CREATE INDEX personnes_noms ON personnes ((prenom || ' ' || nom));
La syntaxe de la commande CREATE INDEX
nécessite normalement
de mettre des parenthèses autour de l'expression indexée, comme dans
l'exemple précédent. Les parenthèses peuvent être omises quand l'expression
est un simple appel de fonction, comme dans le premier exemple.
Les expressions d'index sont relativement coûteuses à calculer, car
l'expression doit être recalculée à chaque insertion ou
mise à jour non-HOT de
ligne. Néanmoins, les expressions d'index ne sont
pas recalculées lors d'une recherche par index, car elles sont
déjà stockées dans l'index. Dans les deux exemples ci-dessus, le système
voit la requête comme un WHERE colonne_indexée =
'constante'
. De ce fait, la recherche est aussi rapide que toute
autre requête d'index. Ainsi, les index d'expressions sont utiles
lorsque la rapidité de recherche est plus importante que la rapidité
d'insertion et de mise à jour.