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 |
■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 |
■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 |
■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 |
■SQL例
SELECT * FROM "T4" WHERE "C1"=1 |
この場合,検索時に使用されるインデクスはT4IX1またはT4IX2です。検索時に使用したいインデクスがある場合は,使用したいインデクスの構成列に条件を付加して,インデクスの優先順位を調整してください。
■表およびインデクスの定義
CREATE FIX TABLE "T5"("C1" INT,"C2" CHAR(10),"C3" INT,"C4" INT) IN DBAREA01 |
■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 |
■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 |
■SQL例
SELECT * FROM "T71","T72" |
この場合,検索時に使用されるインデクスはT71IX1とT72IX1です。
XDBでは,FROM句に指定された順にネストループジョインを行います。そのため,外表に当たる表T71の検索では,条件「”T71”.”C1”>=1」だけが使用されます。内表に当たる表T72の検索では,条件「”T72”.”C2”=”T71”.”C2”」と「”T72”.”C3”<=10」が使用されます。