関数インデックスでは、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: 上記の段落で記述されている制約は簡単に回避できます。そのためには、インデックス定義で使用する関数を、必要な結果を内部的に計算するようにカスタマイズして定義します。