SQL 例
4 性能向上策
4.3 SQL の最適化
4.3.3 インデクスの優先順位
合は,WHERE句で先に記述した条件を使用します。そのため,検索範囲を絞り込める 条件を
WHERE
句で先に記述してください。表
4-4 インデクスの優先順位
注※
1
ソートに対してインデクスを使用するケースについては,「3.3.1(1)インデクスの効 果的な使い方」を参照してください。
注※
2
集合関数に対してインデクスを使用するケースについては,「4.3.5 集合関数の高速 処理機能」を参照してください。
注※
3
インデクスを使用して列値を取り出すケースについては,「4.3.6 キースキャンによ る列値取得機能」を参照してください。
優先順位 インデクスの内容 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
参考
検索時に使用されたインデクスは,次に示すどちらかの方法で確認できます。
• eexdbsqlコマンドの#SET OPT REPORTの実行結果
• アクセスパス情報
eexdbsqlコマンドの#SET OPT REPORTについては,「10.運用コマンド」の「eexdbsql
(SQLの実行)」の「■#SET OPT REPORT(インデクス情報,作業表情報の表示)」を参 照してください。
アクセスパス情報については,「7.6 アクセスパス情報の表示」を参照してください。
検索時に使用されるインデクスの例を次に示します。
(1) 検索時に使用されるインデクスの例(その 1)
■表およびインデクスの定義
■
SQL
例この場合,検索時に使用されるインデクスは
T1IX1
です。インデクスT1IX1
にはインデ クスの優先順位2
が適用され,インデクスT1IX2
にはインデクスの優先順位3
が適用さ れます。(2) 検索時に使用されるインデクスの例(その 2)
■表およびインデクスの定義
■
SQL
例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
SELECT * FROM "T1" WHERE "C1"=1 AND "C2">'ABC'
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
SELECT * FROM "T2" WHERE "C1"<=1 AND "C2">'ABC'
ス
T2IX2
には,インデクスの優先順位3
が適用されます。そのため,WHERE句で先に 記述した条件が優先されます。(3) 検索時に使用されるインデクスの例(その 3)
■表およびインデクスの定義
■
SQL
例この場合,検索時に使用されるインデクスは
T3IX1
です。複数列インデクスの場合,イ ンデクスの優先順位を第一構成列から順に比較していきます。この例では,第一構成列 に対するインデクスの優先順位が等しいため,第二構成列に対するインデクスの優先順 位が比較されます。(4) 検索時に使用されるインデクスの例(その 4)
■表およびインデクスの定義
■
SQL
例この場合,検索時に使用されるインデクスは
T4IX1
またはT4IX2
です。検索時に使用し たいインデクスがある場合は,使用したいインデクスの構成列に条件を付加して,イン デクスの優先順位を調整してください。(5) 検索時に使用されるインデクスの例(その 5)
■表およびインデクスの定義
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
SELECT * FROM "T3" WHERE "C1"=1 AND "C2"='ABC' AND "C3">10
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
SELECT * FROM "T4" WHERE "C1"=1
■
SQL
例この場合,検索時に使用されるインデクスは
T5IX1
です。インデクスT5IX1
にはインデ クスの優先順位2
が適用され,インデクスT5IX2
にはインデクスの優先順位4
が適用さ れます。(6) 検索時に使用されるインデクスの例(その 6)
■表およびインデクスの定義
■
SQL
例この場合,検索時に使用されるインデクスは
T6IX1
です。インデクスT6IX1
にはインデ クスの優先順位6
が適用され,インデクスT6IX2
にはインデクスの優先順位が適用され ません。(7) 検索時に使用されるインデクスの例(その 7)
■表およびインデクスの定義
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
SELECT * FROM "T5" WHERE "C1"=1 ORDER BY "C2"
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
SELECT "C1","C2" FROM "T6"
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
この場合,検索時に使用されるインデクスは
T71IX1
とT72IX1
です。XDB
では,FROM句に指定された順にネストループジョインを行います。そのため,外 表に当たる表T71
の検索では,条件「T71 . C1 >=1」だけが使用されます。内表
に当たる表T72
の検索では,条件「T72 . C2 = T71 . C2
」と「T72 . C3 <=10」が使用されます。
ポイント
インデクスの優先順位を利用すると,インデクスの定義を変更しないでもXDBが検索時に 使用するインデクスを変更できます。XDBが検索時に使用するインデクスを変更する方法 については,マニュアル「TP1/EE/Extended Data Cache SQLプログラミング」の「検索 時に使用するインデクスを変更する方法」を参照してください。