関数インデックスでは、インデックスは、1つのテーブルの1つ以上の列に適用された関数の結果上で定義されます。関数インデックスは、関数呼び出しの結果に基づくデータへの速いアクセスを得るために使うことができます。
例えば、大文字/小文字を関係なく比較をするための一般的な方法として、lower関数を使います。
SELECT * FROM test1 WHERE lower(col1) = 'value';
インデックスがlower(column)演算の結果で定義されていれば、この問い合わせでインデックスを使用することができます。
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
インデックス定義の関数は1つ以上の引数を取ることができますが、定数ではなくテーブル列でなくてはいけません。関数インデックスは、たとえその関数が1つ以上の入力フィールドを使うとしても、常にシングル列(すなわち関数の結果)です。関数呼び出しを含むマルチ列インデックスは作成できません。
Tip: しかし、上記の制約は、インデックス定義で使用する、結果を内部的に求める関数を定義することにより、簡単に実現することができます。