5.3.3 単一列インデクスと複数列インデクスの使い分け
B-treeインデクスには,単一列インデクスと複数列インデクスがあります。
-
単一列インデクス
表の1つの列で1つのB-treeインデクスを作成したものを指します。単一列インデクスは,1つの列をキーにして検索する場合に指定します。
-
複数列インデクス
表の複数の列で1つのB-treeインデクスを作成したものを指します。
単一列インデクスと複数列インデクスの使い分けについて,次で説明します。
(1) 単一列インデクスを定義した方がよい場合
1つの列をキーにして検索する場合は,単一列インデクスを定義してください。
例えば,次のような検索をする場合には,列C1に単一列インデクスを定義します。
- SQLの指定例
-
SELECT * FROM "T1" WHERE "C1" = 1
- B-treeインデクスの定義例
-
CREATE INDEX "T1IX_C1" ON "T1" ("C1" ASC) IN DBAREA01 EMPTY
(2) 複数列インデクスを定義した方がよい場合
1つの列だけでは検索する行を十分に絞り込めないため,複数の列をキーにして検索する行を絞り込む場合は,複数列インデクスを定義してください。
例えば,次のような検索をする場合に,列C1と列C2に対してそれぞれ単一列インデクスを定義していると,列C1または列C2のどちらか1つのB-treeインデクスしか使用されません。そのため,列C1と列C2を構成列とする複数列インデクス(T1IX_C1C2)を定義します。
- SQLの指定例
-
SELECT * FROM "T1" WHERE "C1" = 1 AND "C2" = 'A'
- B-treeインデクスの定義例
-
CREATE INDEX "T1IX_C1C2" ON "T1"("C1" ASC,"C2" ASC) IN DBAREA01 EMPTY
なお,複数列インデクスを使って探索条件を評価する場合,複数列インデクスを定義したときの列の指定順に値を評価します。そのため,複数列インデクスを定義する際は,検索時に指定する探索条件などを考慮して列の指定順序を決定してください。
例えば,上記の「SQLの指定例」を実行する場合,「B-treeインデクスの定義例」のとおりCREATE INDEX文を実行することを推奨します。
(3) 複数列インデクスを使用するときの留意事項
探索条件によるデータの絞り込み範囲について説明します。
複数列インデクスを使用して検索する行を絞り込む場合,SELECT文のWHERE句に指定する探索条件によって検索範囲の絞り込み方が異なります。インデクス構成列の指定順序は,「=条件」を指定することが多い列を先に指定する方が検索範囲を小さくできます。
WHERE句の探索条件の指定と検索範囲の関係を次に示します。
- B-treeインデクスの定義例
-
CREATE INDEX "T1IX_C1C2C3" ON "T1"("C1" ASC,"C2" ASC,"C3" ASC) IN DBAREA01 EMPTY
- 注※1
-
列C2に対する条件が「=条件」または「IS NULL条件」ではないため,列C3に対する条件は検索範囲の絞り込みには使用されません。
- 注※2
-
列C2に対する条件がないため,列C3に対する条件は検索範囲の絞り込みには使用されません。
- 注※3
-
列C1に対する条件が「=条件」または「IS NULL条件」ではないため,列C2と列C3に対する条件は検索範囲の絞り込みには使用されません。
- 注※4
-
列C1に対する条件がないため,列C2や列C3に対する条件は検索範囲の絞り込みには使用されません。