Documentation PostgreSQL 8.1.23 > Langage SQL > Index > Index sur des expressions | |
Index uniques | Index partiels |
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.