4.3.3 インデクスの優先順位

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

注※1
ソートに対してインデクスを使用するケースについては,「3.3.1(1)インデクスの効果的な使い方」を参照してください。
注※2
集合関数に対してインデクスを使用するケースについては,「4.3.5 集合関数の高速処理機能」を参照してください。
注※3
インデクスを使用して列値を取り出すケースについては,「4.3.6 キースキャンによる列値取得機能」を参照してください。

参考
検索時に使用されたインデクスは,次に示すどちらかの方法で確認できます。
  • eexdbsqlコマンドの#SET OPT REPORTの実行結果
  • アクセスパス情報
eexdbsqlコマンドの#SET OPT REPORTについては,「10.運用コマンド」の「eexdbsql(SQLの実行)」の「■#SET OPT REPORT(インデクス情報,作業表情報の表示)」を参照してください。
アクセスパス情報については,「7.6 アクセスパス情報の表示」を参照してください。

検索時に使用されるインデクスの例を次に示します。

<この項の構成>
(1) 検索時に使用されるインデクスの例(その1)
(2) 検索時に使用されるインデクスの例(その2)
(3) 検索時に使用されるインデクスの例(その3)
(4) 検索時に使用されるインデクスの例(その4)
(5) 検索時に使用されるインデクスの例(その5)
(6) 検索時に使用されるインデクスの例(その6)
(7) 検索時に使用されるインデクスの例(その7)

(1) 検索時に使用されるインデクスの例(その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が適用されます。

(2) 検索時に使用されるインデクスの例(その2)

■表およびインデクスの定義

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句で先に記述した条件が優先されます。

(3) 検索時に使用されるインデクスの例(その3)

■表およびインデクスの定義

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です。複数列インデクスの場合,インデクスの優先順位を第一構成列から順に比較していきます。この例では,第一構成列に対するインデクスの優先順位が等しいため,第二構成列に対するインデクスの優先順位が比較されます。

(4) 検索時に使用されるインデクスの例(その4)

■表およびインデクスの定義

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です。検索時に使用したいインデクスがある場合は,使用したいインデクスの構成列に条件を付加して,インデクスの優先順位を調整してください。

(5) 検索時に使用されるインデクスの例(その5)

■表およびインデクスの定義

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が適用されます。

(6) 検索時に使用されるインデクスの例(その6)

■表およびインデクスの定義

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にはインデクスの優先順位が適用されません。

(7) 検索時に使用されるインデクスの例(その7)

■表およびインデクスの定義

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」が使用されます。

ポイント
インデクスの優先順位を利用すると,インデクスの定義を変更しないでもXDBが検索時に使用するインデクスを変更できます。XDBが検索時に使用するインデクスを変更する方法については,マニュアル「TP1/EE/Extended Data Cache SQLプログラミング」の「検索時に使用するインデクスを変更する方法」を参照してください。