11.5. 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 bas� 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) = 'value';

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 �tres d�finies avec une simple contrainte.

Un autre exemple, si vous faites souvent des requ�tes comme celle-ci:

SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';

alors il peut �tre utile de cr�er un index comme celui-ci:

CREATE INDEX people_names ON people ((first_name || ' ' || last_name));

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 juste un 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. C'est pourquoi les index bas�s sur des expressions ne doivent �tre utilis�s que quand les requ�tes qui les ex�cutent sont tr�s fr�quentes.