高速トランザクション処理基盤 TP1/EE/Extended Data Cache 使用の手引
インデクスには,単一列インデクスと複数列インデクスがあります。一つの列から作成したインデクスを単一列インデクスといい,複数の列から作成したインデクスを複数列インデクスといいます。
単一列インデクスと複数列インデクスの使い分けについて,例を使って説明します。
一つの列をキーにして検索する場合は,単一列インデクスを定義してください。また,データのソート(ORDER BY句)に使用する列が1列の場合も,単一列インデクスを定義してください。
例えば,次のような検索を行う場合に,C1列に単一列インデクスを定義します。インデクスの定義例では,C1列に対して,単一列インデクスT1IX1を定義しています。
SELECT * FROM "T1" WHERE "C1" = 1 SELECT * FROM "T1" ORDER BY "C1" ASC |
CREATE INDEX "T1IX1" ON "T1"("C1" ASC) IN DBAREA01 |
一つの列だけでは検索する行を十分に絞り込めないため,複数の列をキーとして検索する行を絞り込む場合は,複数列インデクスを定義してください。また,データのソート(ORDER BY句)に使用する列が複数の場合も,複数列インデクスを定義してください。
例えば,次のような検索を行う場合に,C1列とC2列に対して複数列インデクスを定義します。インデクスの定義例では,C1列とC2列に対して,複数列インデクスT1IX1を定義しています。
SELECT * FROM "T1" WHERE "C1" = 1 AND "C2" = 'A' SELECT * FROM "T1" ORDER BY "C1" ASC, "C2" ASC |
CREATE INDEX "T1IX1" ON "T1"("C1" ASC,"C2" ASC) IN DBAREA01 |
複数列インデクスを使用するときの留意事項について説明します。
複数列インデクスを使用して検索する行を絞り込む場合,WHERE句の探索条件の指定によって検索範囲の絞り込み方が異なります。
WHERE句の探索条件の指定と検索範囲の関係を次に示します。
CREATE INDEX "T1IX1" ON "T1"("C1" ASC,"C2" ASC,"C3" ASC) IN DBAREA01 |
ソート(ORDER BY句)の指定によっては,インデクスの効果を十分に得られないことがあります。ソート(ORDER BY句)の指定順序と,インデクス構成列の指定順序を合わせると,データの並び替えをインデクスで代用できるため,ソート処理のオーバヘッドを削減できます。
次のようなインデクスを定義した場合を例に,データのソートとインデクスの関係を次の表に示します。
CREATE INDEX "T1IX1" ON "T1"("C1" ASC,"C2" ASC,"C3" ASC) IN DBAREA01 CREATE INDEX "T1IX2" ON "T1"("C4" ASC) IN DBAREA02 |
表3-2 データのソートとインデクスの関係
項番 | データのソート | ソート処理のオーバヘッド削減 |
---|---|---|
1 | SELECT * FROM "T1" ORDER BY "C1" ASC,"C2" ASC,"C3" ASC |
○ |
2 | SELECT * FROM "T1" ORDER BY "C1" DESC,"C2" DESC,"C3" DESC |
○※1 |
3 | SELECT * FROM "T1" ORDER BY "C1" DESC,"C2" ASC,"C3" ASC |
× |
4 | SELECT * FROM "T1" ORDER BY "C1" ASC,"C2" ASC |
○※2 |
5 | SELECT * FROM "T1" ORDER BY "C1" ASC,"C2" ASC,"C3" ASC,"C4" ASC |
× |
6 | SELECT * FROM "T1" WHERE "C1" > 0 ORDER BY "C1" ASC,"C2" ASC,"C3" ASC |
○ |
7 | SELECT * FROM "T1" WHERE "C4" > 0 ORDER BY "C1" ASC,"C2" ASC,"C3" ASC |
×※3 |
All Rights Reserved. Copyright (C) 2008, Hitachi, Ltd.