13.6 インデクスの優先順位
検索する表に複数のインデクスが定義されている場合,HiRDBが使用するインデクスの優先順位について,次の表に示します。SQLで使用したいインデクスの優先順位を確認してください。使用したいインデクスよりも優先順位の高い別のインデクスがある場合は,使用インデクスのSQL最適化指定で,使用したいインデクス名を指定してください。詳細については,マニュアル「HiRDB Version 9 SQLリファレンス」の「使用インデクスのSQL最適化指定」を参照してください。
優先順位 |
HiRDBが優先して使用するインデクスの内容 |
インデクスがある列(C1)に対する条件の指定例 |
---|---|---|
1 (必ず使用する※1) |
インデクス型プラグイン専用関数の条件が「IS TRUE」であり,この関数の第一引数の列に指定したプラグインインデクス |
contains(C1,'…') IS TRUE |
構造化繰返し述語の探索条件に含まれるすべての列をインデクス構成列に含むインデクス |
ARRAY(C1,C2)[ANY] (C1='ABC' and C2=10) C1,C2の複数列インデクスを定義しています。 |
|
2 |
プラグイン提供関数の条件が「IS TRUE」であり,この関数の第一引数の列に指定したプラグインインデクス |
within(C1,'…') IS TRUE |
3 |
「=」の制限条件の対象になる列にある,UNIQUEを指定したインデクス |
C1=100 |
4 |
「=」の制限条件の対象になる列にあるインデクス |
C1=100 |
5 |
「IS NULL」の制限条件の対象になる列にあるインデクス※2 |
C1 IS NULL |
6 |
LIKE述語,又はSIMILAR述語のパターン文字列に定数で「%」による前方一致比較を指定した列にあるインデクス |
C1 LIKE 'ABC%' C1 SIMILAR TO 'ABC%' |
7 |
LIKE述語,又はSIMILAR述語のパターン文字列に定数で上記以外の前方一致比較を指定した列にあるインデクス |
C1 LIKE 'ABC_' C1 SIMILAR TO 'ABC_' |
8 |
IN述語の制限条件の対象になる列にあるインデクス |
C1 IN(10,20,30) |
9 |
BETWEEN述語の制限条件の対象になる列にあるインデクス |
C1 BETWEEN 20 AND 40 |
範囲条件を指定した列にあるインデクス |
20<=C1 AND C1<=40 |
|
10 |
外への参照がない副問合せを使用したIN述語の制限条件の対象になる列にある単一列インデクス |
C1 IN(SELECT C1 FROM T2) |
外への参照がない副問合せを使用した限定述語「=ANY」又は「=SOME」の制限条件の対象になる列にある単一列インデクス |
C1=ANY(SELECT C1 FROM T2) C1=SOME(SELECT C1 FROM T2) |
|
11 |
>,>=,<及び<=の制限条件の対象になる列にあるインデクス |
C1>50 C1<=200 |
12※3 |
スカラ演算(システム定義スカラ関数,IS_USER_CONTAINED_IN_HDS_GROUPは除く)を指定した列にあるインデクス※2 |
length(C1)=10 |
13 |
NOT BETWEEN述語の制限条件の対象になる列にあるインデクス |
C1 NOT BETWEEN 10 AND 30 |
14 |
XLIKE述語及び上記以外のLIKE述語,又はSIMILAR述語の制限条件の対象になる列にあるインデクス |
C1 XLIKE '%ABC%' C1 LIKE '%ABC%' C1 SIMILAR TO '%ABC%' |
15 |
集合関数(MIN又はMAX)の引数に指定した列にあるインデクス※4 |
MIN(C1) MAX(C1) |
16 |
結合条件列及びグループ分け又はソートの対象になる列にあるインデクス |
ORDER BY C1 |
− |
否定(NOT BETWEENを除く)の制限条件の対象になる列にあるインデクス |
C1 NOT LIKE '%ABC%' C1 IS NOT NULL |
上記以外の限定述語「ANY」又は「SOME」の制限条件の対象になる列にあるインデクス |
C1>=ANY(SELECT C1 FROM T2) C1>SOME(SELECT C1 FROM T2) |
|
限定述語「ALL」の制限条件の対象になる列にあるインデクス |
C1>ALL(SELECT C1 FROM T2) |
|
プラグイン提供関数の条件が「IS FALSE」又は「IS UNKNOWN」であり,この関数の第一引数の列に指定したプラグインインデクス |
within(C1,'…') IS FALSE |
(凡例)−:使用しないインデクスを示します。
- 注
-
-
関数呼出し「contains」は,HiRDB Text Search Plug-inが提供するプラグインの関数です。
-
関数呼出し「within」は,HiRDB Spatial Search Plug-inが提供するプラグインの関数です。
-
外への参照がある副問合せを含む制限条件の対象になる列にあるインデクスは使用できません。
-
OR演算子で両側の条件式にインデクスを利用できる場合は,優先度がその条件式中の述語によって変わります。
-
制限条件とは,結合条件以外の探索条件のことです。
-
定義したインデクスが有効に利用できないとHiRDBが判断した場合は,該当するインデクスが使用されないことがあります。
-
- 注※1
-
このインデクスを定義していないと,実行できないでエラーとなります。必ず定義してください。
- 注※2
-
次の列に対して,ナル値を除外キーとするインデクスは使用しません。
-
「IS NULL」の制限条件を指定した列
-
制限条件中の「VALUE」及び「CASE式」に指定した列
-
制限条件中の「BIT_AND_TEST」に対して「IS UNKNOWN」,「IS NOT TRUE」,又は「IS NOT FALSE」を指定し,この「BIT_AND_TEST」に指定した列
ただし,上記以外の制限条件を指定しているインデクスは使用します。その場合のナル値を除外キーとするインデクスの使用有無を表「ナル値を除外キーとするインデクスの使用有無」に示します。
-
- 注※3
-
SQL最適化オプションに「スカラ演算を含むキー条件の適用」を指定した場合だけ,インデクスを優先して使用します。SQL最適化オプションの詳細は,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。また,述語の種類によっては優先順位が下がることもあります。否定が含まれない場合の優先順位は13〜15の範囲になります。否定が含まれる場合の優先順位は13〜−の範囲になります。
- 注※4
-
表の指定が一つで,GROUP BYを指定していないSQL文の場合は,集合関数(MIN又はMAX)だけを指定して,次に示すどれかの条件を満たすときに引数に指定した列のインデクスを使用します。
-
集合関数の引数に指定した列が,単一列インデクスの構成列の場合
-
集合関数の引数に指定した列が,除外キーを持たない複数列インデクスの第n構成列の場合で,第1構成列から第(n−1)構成列までに「=」又は「IS NULL」を指定したとき
-
集合関数の引数に指定した列が,除外キーを持つ複数列インデクスの第n構成列の場合で,第1構成列から第(n−1)構成列までに「=」を指定したとき
表13‒4 ナル値を除外キーとするインデクスの使用有無 構成列に指定する制限条件
使用有無
IS NULL,VALUE,CASE式,BIT_AND_TEST
IS NULL,VALUE,CASE式,BIT_AND_TEST以外※1
指定あり
指定あり
使用します
指定あり
指定なし
使用しません
指定なし
指定あり
使用します※2
指定なし
指定なし
使用しません※3
-
- 注※1
-
「HiRDBが使用するインデクスの優先順位」に示す優先順位の4〜15の制限条件の場合です。
- 注※2
-
インデクスが有効に利用できない場合などは,HiRDBが判断してインデクスを使用しないことがあります。
- 注※3
-
次に示すすべての条件を満たす検索では使用します。
-
選択式が,インデクス構成列を引数とする集合関数だけ
-
FROM句には,一つの表だけ指定している
-
WHERE句の指定がない
-