オプティマイザはいくつかの方法で複合インデックス (複数の列を網羅するインデックス) を使用することができます。
最初のフィルタが等号フィルタであり、その後の列が範囲式 (<、<=、>、>=) であれば、データベース サーバは複合インデックスを使用することができます。次に示すのは、複合インデックス内の列を使用するフィルタの例です。
WHERE a=1
WHERE a>=12 AND a<15
WHERE a=1 AND b < 5
WHERE a=1 AND b = 17 AND c >= 40
次に示すのは、複合インデックスを使用できないフィルタの例です。
WHERE b=10
WHERE c=221
WHERE a>=12 AND b=15
インデックスは使用しても、表は参照しない走査を、キーオンリー検索 と呼びます。
最上位ディスティンクトから最下位ディスティンクトへの順で列の複合インデックスを作成した場合が、最も効果的に実行されます。つまり、SELECT 文でキーワード DISTINCT を使用して問合せが行われた場合、最も大きいディスティンクト行数を返す列が、複合インデックスの先頭に配置されるということです。
SELECT * FROM t1 ORDER BY a, b DESC;
一時表によって列 a を昇順に、列 b を降順にソートしないようにするため、複合インデックスを (a、b DESC) または (a DESC、b) に作成する必要があります。データベース サーバには双方向トラバース機能があるため、どちらか 1 つのインデックスを作成する必要があります。双方向トラバースについて詳しくは、「IBM Informix SQL ガイド: シンタックス」を参照してください。