高速トランザクション処理基盤 TP1/EE/Extended Data Cache 使用の手引

[目次][用語][索引][前へ][次へ]

3.3.2 単一列インデクスと複数列インデクスの使い分け

インデクスには,単一列インデクスと複数列インデクスがあります。一つの列から作成したインデクスを単一列インデクスといい,複数の列から作成したインデクスを複数列インデクスといいます。

単一列インデクスと複数列インデクスの使い分けについて,例を使って説明します。

<この項の構成>
(1) 単一列インデクスを定義した方がよいケース
(2) 複数列インデクスを定義した方がよいケース
(3) 複数列インデクスを使用するときの留意事項

(1) 単一列インデクスを定義した方がよいケース

一つの列をキーにして検索する場合は,単一列インデクスを定義してください。また,データのソート(ORDER BY句)に使用する列が1列の場合も,単一列インデクスを定義してください。

例えば,次のような検索を行う場合に,C1列に単一列インデクスを定義します。インデクスの定義例では,C1列に対して,単一列インデクスT1IX1を定義しています。

SQL例
 
SELECT * FROM "T1" WHERE "C1" = 1
SELECT * FROM "T1" ORDER BY "C1" ASC
 
インデクスの定義例
 
CREATE INDEX "T1IX1" ON "T1"("C1" ASC) IN DBAREA01
 

(2) 複数列インデクスを定義した方がよいケース

一つの列だけでは検索する行を十分に絞り込めないため,複数の列をキーとして検索する行を絞り込む場合は,複数列インデクスを定義してください。また,データのソート(ORDER BY句)に使用する列が複数の場合も,複数列インデクスを定義してください。

例えば,次のような検索を行う場合に,C1列とC2列に対して複数列インデクスを定義します。インデクスの定義例では,C1列とC2列に対して,複数列インデクスT1IX1を定義しています。

SQL例
 
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
 

(3) 複数列インデクスを使用するときの留意事項

複数列インデクスを使用するときの留意事項について説明します。

(a) 探索条件によるデータの絞り込み範囲

複数列インデクスを使用して検索する行を絞り込む場合,WHERE句の探索条件の指定によって検索範囲の絞り込み方が異なります。

WHERE句の探索条件の指定と検索範囲の関係を次に示します。

インデクスの定義
 
CREATE INDEX "T1IX1" ON "T1"("C1" ASC,"C2" ASC,"C3" ASC) IN DBAREA01
 
WHERE句の探索条件と検索範囲
[図データ]
注※1
C2列に対する条件が=条件でないため,C3列に対する条件は検索範囲の絞り込みに使用されません。
注※2
C2列に対して条件指定がないため,C3列に対する条件は検索範囲の絞り込みに使用されません。
注※3
C1列に対する条件が=条件でないため,C2列とC3列に対する条件は検索範囲の絞り込みに使用されません。
注※4
インデクスの第一構成列に対して条件指定がないため,検索時にインデクスが使用されません。
 
ポイント
  • インデクス構成列の指定順序については,=条件を指定することが多い列を先に指定する方が検索範囲を小さくできます。
  • インデクスの第一構成列に条件が指定されていない場合,そのインデクスは使用されません。
(b) データのソートとインデクスの関係

ソート(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
(凡例)
○:データの並び替えをインデクスで代用できるため,ソート処理のオーバヘッドを削減できます。
×:データの並び替えをインデクスで代用できないため,ソート処理のオーバヘッドを削減できません。
注※1
昇順,降順の指定がすべて逆の場合,データの並び替えをインデクスで代用できるため,ソート処理のオーバヘッドを削減できます。
注※2
ORDER BY句の列の並びを含むインデクスであれば,インデクス構成列が多くても,データの並び替えをインデクスで代用できるため,ソート処理のオーバヘッドを削減できます。
注※3
WHERE句の指定によってインデクスT1IX2が優先して使用されるため,データの並び替えをインデクスで代用できません。そのため,ソート処理のオーバヘッドは削減できません。