高速トランザクション処理基盤 TP1/EE/Extended Data Cache 使用の手引
XDBでは,次の表に示すインデクスの優先順位に従って,検索時に使用するインデクスを決定しています。
なお,インデクスの優先順位が等しい場合や,同じ列に複数の条件が指定されている場合は,WHERE句で先に記述した条件を使用します。そのため,検索範囲を絞り込める条件をWHERE句で先に記述してください。
表4-4 インデクスの優先順位
| 優先順位 | インデクスの内容 | SQLの記述例 |
|---|---|---|
| 1 | すべてのインデクス構成列に=条件が指定されているユニークインデクス | WHERE "C1" = 1 |
| 2 | インデクスの第一構成列に=条件が指定されているインデクス | WHERE "C1" = 1 |
| 3 | インデクスの第一構成列に条件が指定されているインデクス | WHERE "C1" >= 1 |
WHERE "C1" BETWEEN 1 AND 10 |
||
| 4 | ソートに使用できるインデクス※1 | SELECT * FROM "T1" ORDER BY "C1" |
| 5 | 集合関数のCOUNT(*),またはCOUNTに使用できるインデクス※2 | SELECT COUNT(*) FROM "T1" |
SELECT COUNT("C1") FROM "T1"
|
||
SELECT COUNT(DISTINCT "C1") FROM "T1" |
||
| 6 | データを取り出す列をすべて含むインデクス※3 | SELECT "C1" FROM "T1" |
| インデクスを使用しない | 否定の述語 | WHERE "C1" <> 1 |
WHERE "C1" NOT BETWEEN 1 AND 10 |
||
| 論理演算子ORに含まれる列に定義されたインデクス | WHERE "C1" = 1 OR "C1" = 2 |
|
| 論理演算子NOTに含まれる列に定義されたインデクス | WHERE NOT "C1" = 1 |
検索時に使用されるインデクスの例を次に示します。
■表およびインデクスの定義
CREATE FIX TABLE "T1"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01
CREATE INDEX "T1IX1" ON "T1"("C1") IN DBAREA02
CREATE INDEX "T1IX2" ON "T1"("C2") IN DBAREA03
|
■SQL例
SELECT * FROM "T1" WHERE "C1"=1 AND "C2">'ABC' |
この場合,検索時に使用されるインデクスはT1IX1です。インデクスT1IX1にはインデクスの優先順位2が適用され,インデクスT1IX2にはインデクスの優先順位3が適用されます。
■表およびインデクスの定義
CREATE FIX TABLE "T2"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01
CREATE INDEX "T2IX1" ON "T2"("C1") IN DBAREA02
CREATE INDEX "T2IX2" ON "T2"("C2") IN DBAREA03
|
■SQL例
SELECT * FROM "T2" WHERE "C1"<=1 AND "C2">'ABC' |
この場合,検索時に使用されるインデクスはT2IX1です。インデクスT2IX1とインデクスT2IX2には,インデクスの優先順位3が適用されます。そのため,WHERE句で先に記述した条件が優先されます。
■表およびインデクスの定義
CREATE FIX TABLE "T3"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01
CREATE INDEX "T3IX1" ON "T3"("C1","C2") IN DBAREA02
CREATE INDEX "T3IX2" ON "T3"("C1","C3") IN DBAREA03
|
■SQL例
SELECT * FROM "T3" WHERE "C1"=1 AND "C2"='ABC' AND "C3">10 |
この場合,検索時に使用されるインデクスはT3IX1です。複数列インデクスの場合,インデクスの優先順位を第一構成列から順に比較していきます。この例では,第一構成列に対するインデクスの優先順位が等しいため,第二構成列に対するインデクスの優先順位が比較されます。
■表およびインデクスの定義
CREATE FIX TABLE "T4"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01
CREATE INDEX "T4IX1" ON "T4"("C1","C2") IN DBAREA02
CREATE INDEX "T4IX2" ON "T4"("C1","C3") IN DBAREA03
|
■SQL例
SELECT * FROM "T4" WHERE "C1"=1 |
この場合,検索時に使用されるインデクスはT4IX1またはT4IX2です。検索時に使用したいインデクスがある場合は,使用したいインデクスの構成列に条件を付加して,インデクスの優先順位を調整してください。
■表およびインデクスの定義
CREATE FIX TABLE "T5"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01
CREATE INDEX "T5IX1" ON "T5"("C1") IN DBAREA02
CREATE INDEX "T5IX2" ON "T5"("C2") IN DBAREA03
|
■SQL例
SELECT * FROM "T5" WHERE "C1"=1 ORDER BY "C2" |
この場合,検索時に使用されるインデクスはT5IX1です。インデクスT5IX1にはインデクスの優先順位2が適用され,インデクスT5IX2にはインデクスの優先順位4が適用されます。
■表およびインデクスの定義
CREATE FIX TABLE "T6"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01
CREATE INDEX "T6IX1" ON "T6"("C1","C2") IN DBAREA02
CREATE INDEX "T6IX2" ON "T6"("C3") IN DBAREA03
|
■SQL例
SELECT "C1","C2" FROM "T6" |
この場合,検索時に使用されるインデクスはT6IX1です。インデクスT6IX1にはインデクスの優先順位6が適用され,インデクスT6IX2にはインデクスの優先順位が適用されません。
■表およびインデクスの定義
CREATE FIX TABLE "T71"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01
CREATE INDEX "T71IX1" ON "T71"("C1") IN DBAREA02
CREATE INDEX "T71IX2" ON "T71"("C2") IN DBAREA03
CREATE FIX TABLE "T72"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA04
CREATE INDEX "T72IX1" ON "T72"("C2") IN DBAREA05
CREATE INDEX "T72IX2" ON "T72"("C3") IN DBAREA06
|
■SQL例
SELECT * FROM "T71","T72"
WHERE "T71"."C1">=1
AND "T72"."C2"="T71"."C2" AND "T72"."C3"<=10
|
この場合,検索時に使用されるインデクスはT71IX1とT72IX1です。
XDBでは,FROM句に指定された順にネストループジョインを行います。そのため,外表に当たる表T71の検索では,条件「”T71”.”C1”>=1」だけが使用されます。内表に当たる表T72の検索では,条件「”T72”.”C2”=”T71”.”C2”」と「”T72”.”C3”<=10」が使用されます。
All Rights Reserved. Copyright (C) 2008, Hitachi, Ltd.