11.6. Index sur des expressions
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 se basant sur les résultat des 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. Cet index
est créé avec la commande :
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
Si nous avions déclaré cet index UNIQUE, il
empêcherait la création de lignes dont la valeur de la colonne
col1 ne diffère que par la casse. Ainsi, les
index sur les expressions peuvent être utilisés pour vérifier des
contraintes qui ne peuvent être définies avec une simple contrainte.
Un autre exemple, si vous faites souvent des requêtes comme celle-ci
:
SELECT * FROM personnes WHERE (prenom || ' ' || nom) = 'Jean Dupont';
alors il peut être utile de créer un index comme celui-ci :
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és, 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
de chaque ligne. Néanmoins, les expressions d'index ne sont
pas
recalculés lors d'une
recherche par index car ils sont déjà stockés dans l'index. Dans les
deux exemples ci-dessus, le système voit la requête comme un
WHERE colonne_indexée = 'constante' et, du
coup, la rapidité de la recherche est équivalente à une autre simple
recherche d'index. Du coup, les index avec des expressions sont
utiles quand la rapidité de la recherche est plus importante que la
rapidité de l'insertion et de la mise à jour.