Hitachi

Hitachi Advanced Data Binder AP開発ガイド


5.2.1 インデクスの優先順位と選択規則

表に複数のインデクスが定義されている場合,WHERE句の探索条件や,結合表のON 探索条件に指定された条件に従って,使用されるインデクスが決定されます。

ここでは,SQL文の実行時に使用されるインデクスの優先順位と選択規則について説明します。

〈この項の構成〉

(1) インデクスの優先順位

探索条件に指定した述語が次の表に示す形式で指定されている場合に,SQL文の実行時にインデクスが使用されます。また,SQL文の実行時に使用されるインデクスは1つだけです。そのため,表に複数のインデクスが定義されている場合,次の表に示す優先順位に従って,使用されるインデクスが決定されます。

表5‒1 表に複数のインデクスが定義されている場合のインデクスの優先順位

優先順位

インデクスの条件

この優先順位に該当する指定例(C1はインデクスが定義されている列)

1

= 条件中にすべてのインデクス構成列が指定されているユニークインデクス(B-treeインデクス)

"C1"=100

"C1"=100+?

"T1"."C1"=CAST("T2"."C1" AS INTEGER)

2

= 条件中にインデクス構成列が指定されているB-treeインデクス

"C1"=100

"C1"=100+?

"T1"."C1"=CAST("T2"."C1" AS INTEGER)

3

IS NULL条件中にインデクス構成列が指定されているB-treeインデクス

"C1" IS NULL

4

次のすべての条件を満たすLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

  • パターン文字列に定数を指定している

  • 特殊文字%を指定した前方一致検索である

エスケープ文字を指定する場合は,エスケープ文字を定数で指定している必要があります。

"C1" LIKE 'ABC%'

"C1" LIKE 'AB\%C%' ESCAPE '\'

5

次のすべての条件を満たすLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

  • パターン文字列に定数を指定している

  • 優先順位4の指定方法以外の前方一致検索である

エスケープ文字を指定する場合は,エスケープ文字を定数で指定している必要があります。

"C1" LIKE 'ABC__'

"C1" LIKE 'ABC%E'

"C1" LIKE 'AB\_C%E' ESCAPE '\'

パターン文字列に定数を指定した完全一致検索のLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

エスケープ文字を指定する場合は,エスケープ文字を定数で指定している必要があります。

"C1" LIKE 'ABCDE'

"C1" LIKE 'AB\_CDE' ESCAPE '\'

パターン文字列にユーザ情報取得関数を指定したLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

エスケープ文字を指定する場合は,エスケープ文字を定数で指定している必要があります。

"C1" LIKE CURRENT_USER

"C1" LIKE CURRENT_USER ESCAPE '\'

パターン文字列に?パラメタを指定したLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

エスケープ文字を指定する場合は,エスケープ文字を定数で指定している必要があります。

"C1" LIKE ?

"C1" LIKE ? ESCAPE '\'

エスケープ文字に?パラメタを指定したLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

パターン文字列は,定数,ユーザ情報取得関数,または?パラメタのどれかを指定している必要があります。

"C1" LIKE 'AB\%C%' ESCAPE ?

"C1" LIKE CURRENT_USER ESCAPE ?

"C1" LIKE ? ESCAPE ?

6

ワード検索指定(表記ゆれ補正検索指定または同義語検索指定を指定していない場合に限る)を指定したスカラ関数CONTAINS中に,インデクス構成列が指定されているテキストインデクス※2,※8

CONTAINS("C1",'WORDCONTEXT("ABC")')>0

7

次のどちらかの条件を満たすスカラ関数CONTAINS中に,インデクス構成列が指定されているテキストインデクス※2,※4,※8

  • ワード検索指定と表記ゆれ補正検索指定を指定している

  • ワード検索指定と同義語検索指定を指定している

CONTAINS("C1",'WORDCONTEXT(IGNORECASE("ABC"))')>0

CONTAINS("C1",'WORDCONTEXT(SORTCODE("ABC"))')>0

CONTAINS("C1",'WORDCONTEXT(SYNONYM("DIC1","ABC"))')>0

8

LIKE述語中にインデクス構成列が指定されているテキストインデクス※1

"C1" LIKE 'ABC'

"C1" LIKE 'ABC%'

"C1" LIKE '%ABC%'

"C1" LIKE '%ABC'

"C1" LIKE ?

スカラ関数CONTAINS中(表記ゆれ補正検索指定,同義語検索指定,またはワード検索指定を指定していない場合に限る)に,インデクス構成列が指定されているテキストインデクス※2

CONTAINS("C1",'"ABC"')>0

9

次のすべての条件を満たすテキストインデクス※1,※3

  • LIKE述語を指定した条件が,論理演算子ORを使って複数指定されている

  • LIKE述語中の一致値にインデクス構成列が指定されている

"C1" LIKE 'ABC' OR "C1" LIKE 'DEF'

"C1" LIKE 'ABC%' OR "C1" LIKE 'DEF%'

"C1" LIKE '%ABC%' OR "C1" LIKE '%DEF%'

"C1" LIKE ? OR "C1" LIKE ?

次のどちらかの指定をしたスカラ関数CONTAINS中に,インデクス構成列が指定されているテキストインデクス※2,※4

  • 表記ゆれ補正検索指定(ワード検索指定を指定していない場合に限る)

  • 同義語検索指定(ワード検索指定を指定していない場合に限る)

CONTAINS("C1",'IGNORECASE("ABC")')>0

CONTAINS("C1",'SORTCODE("ABC")')>0

CONTAINS("C1",'SYNONYM("DIC1","ABC")')>0

次のすべての条件を満たすテキストインデクス※1,※2,※3,※4

  • LIKE述語を指定した条件,およびスカラ関数CONTAINSを指定した条件が,論理演算子ORを使って複数指定されている

  • LIKE述語中の一致値にインデクス構成列が指定されている

  • スカラ関数CONTAINS中にインデクス構成列が指定されている

"C1" LIKE '%ABC%'

OR

CONTAINS("C1",'"DEF"')>0

"C1" LIKE '%ABC%'

OR

CONTAINS("C1",'"DEF"')>0

OR

CONTAINS("C1",'IGNORECASE("GHI")')>0

次のすべての条件を満たすテキストインデクス※2,※3,※4

  • スカラ関数CONTAINSを指定した条件が,論理演算子ORを使って複数指定されている

  • スカラ関数CONTAINS中にインデクス構成列が指定されている

CONTAINS("C1",'"ABC"')>0

OR

CONTAINS("C1",'"DEF"')>0

CONTAINS("C1",'"ABC"')>0

OR

CONTAINS("C1",'IGNORECASE("ABC")')>0

OR

CONTAINS("C1",'SORTCODE("ABC")')>0

CONTAINS("C1",'"ABC"')>0

OR

CONTAINS("C1",'IGNORECASE("DEF")')>0

OR

CONTAINS("C1",'SORTCODE("GHI")')>0

OR

CONTAINS("C1",'SYNONYM("DIC1","JKL")')>0

CONTAINS("C1",'WORDCONTEXT("ABC")')>0

OR

CONTAINS("C1",'WORDCONTEXT("DEF")')>0

10

LIKE_REGEX述語中の一致値に,インデクス構成列が指定されているテキストインデクス※4,※5

"C1" LIKE_REGEX '^ABC'

"C1" LIKE_REGEX '^ABC' FLAG IGNORECASE

11

次のすべての条件を満たすテキストインデクス※3,※4,※5

  • LIKE_REGEX述語を指定した条件が,論理演算子ORを使って複数指定されている

  • LIKE_REGEX述語中の一致値にインデクス構成列が指定されている

"C1" LIKE_REGEX '^ABC'

OR

"C1" LIKE_REGEX '^DEF'

次のすべての条件を満たすテキストインデクス※1,※3,※4,※5

  • LIKE述語およびLIKE_REGEX述語を指定した条件が,論理演算子ORを使って複数指定されている

  • LIKE述語中の一致値にインデクス構成列が指定されている

  • LIKE_REGEX述語中の一致値にインデクス構成列が指定されている

"C1" LIKE '%ABC%'

OR

"C1" LIKE_REGEX '^DEF'

次のすべての条件を満たすテキストインデクス※2,※3,※4,※5

  • LIKE_REGEX述語を指定した条件,およびスカラ関数CONTAINSを指定した条件が,論理演算子ORを使って複数指定されている

  • LIKE_REGEX述語中の一致値にインデクス構成列が指定されている

  • スカラ関数CONTAINS中にインデクス構成列が指定されている

"C1" LIKE_REGEX '^ABC'

OR

CONTAINS("C1",'"XYZ"')>0

次のすべての条件を満たすテキストインデクス※1,※2,※3,※4,※5

  • LIKE述語を指定した条件,LIKE_REGEX述語を指定した条件,およびスカラ関数CONTAINSを指定した条件が,論理演算子ORを使って複数指定されている

  • LIKE述語中の一致値にインデクス構成列が指定されている

  • LIKE_REGEX述語中の一致値にインデクス構成列が指定されている

  • スカラ関数CONTAINS中にインデクス構成列が指定されている

"C1" LIKE_REGEX '^ABC'

OR

"C1" LIKE '%DEF%'

OR

CONTAINS("C1",'"XYZ"')>0

12

比較値に値指定だけを指定したIN述語中に,インデクス構成列が指定されているB-treeインデクス

"C1" IN (10,20,30)

比較値にスカラ演算を含む値指定だけを指定したIN述語中に,インデクス構成列が指定されているB-treeインデクス

"C1" IN (10,20,30+?)

"T1"."C1" IN (CASE WHEN 100=? THEN 10 ELSE 20 END,30,40)

13

BETWEEN述語中にインデクス構成列が指定されているB-treeインデクス

"C1" BETWEEN 20 AND 40

"C1" BETWEEN 20 AND 40+?

"T1"."C1" BETWEEN "T2"."C1"-6 MONTH AND "T2"."C1"

2つの比較述語を組み合わせた範囲条件に,インデクス構成列が指定されているB-treeインデクス

"C1">=20 AND "C1"<=40

14

次の条件を満たすIN述語中にインデクス構成列が指定されているB-treeインデクス

  • 比較値に外への参照列を含まない副問合せを指定している

"C1" IN (SELECT "C1" FROM "T2")

外への参照列を含まない副問合せを指定した=ANY条件に,インデクス構成列が指定されているB-treeインデクス

"C1"=ANY(SELECT "C1" FROM "T2")

外への参照列を含まない副問合せを指定した=SOME条件に,インデクス構成列が指定されているB-treeインデクス

"C1"=SOME(SELECT "C1" FROM "T2")

15

>>=<,または<=の条件に,インデクス構成列が指定されているB-treeインデクス

"C1">50

"C1"<=200

"C1">=50+?

"T1"."C1" <"T2"."C1"||'X'

16

比較値に列指定を含むIN述語中に,インデクス構成列が指定されているB-treeインデクス

"T1"."C1" IN (10,"T2"."C1")

"T1"."C1" IN (10,"T2"."C1"+?,50)

17

論理演算子ORを指定した条件に,インデクス構成列が指定されているB-treeインデクス※6

"C1"<20 OR "C1">40

18

次のすべての条件を満たすLIKE述語中に,インデクス構成列が指定されているB-treeインデクス※7

  • パターン文字列に定数を指定している

  • 前方一致以外の検索である

"C1" LIKE '%BCD%'

"C1" LIKE '%B\_CD%' ESCAPE '\'

次の条件を満たすLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

  • パターン文字列に列指定を含む値式を指定している

"T1"."C1" LIKE "T2"."C2" || '%'

次の条件を満たすLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

  • パターン文字列にスカラ演算を含む値式を指定している

"C1" LIKE CURRENT_USER || '%'

次の条件を満たすLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

  • エスケープ文字に列指定を含む値式を指定している

"T1"."C1" LIKE 'A\%B@_C%'

ESCAPE "T2"."C1"

次の条件を満たすLIKE述語中に,インデクス構成列が指定されているB-treeインデクス

  • エスケープ文字にスカラ演算を含む値式を指定している

"C1" LIKE 'A\%B@_C%' ESCAPE CASE WHEN 10=? THEN '\' ELSE '@' END

  • 複数列インデクスの場合,B-treeインデクスの第1構成列から順に,上記の表に示す優先順位が適用されます。

  • 基本的には,上記の表に示す優先順位に従って,使用されるインデクスが決まります。ただし,探索条件の指定内容によっては,上記の表に示す優先順位では,有効な評価ができないことがあります。この場合,上記の表の優先順位に従わないインデクスが使用されることがあります。検索時に実際に使用されたインデクスを確認したい場合は,「5.2.5 SQL文の実行時に使用されるインデクスを確認する方法」を参照してください。

注※1

LIKE述語に,次に示す形式のパターン文字列を指定した場合,この条件は該当しません。

  • パターン文字列に特殊文字の%だけを指定している場合

    (例)"C1" LIKE '%'

  • パターン文字列に空文字だけを指定している場合

    (例)"C1" LIKE ''

  • パターン文字列に特殊文字以外の文字を2文字以上連続して指定していない場合

    (例)"C1" LIKE '%A%',"C1" LIKE '%A%B%'

  • 一致値に指定した列と同じ表の列をパターン文字列に指定している場合

    (例)"T1"."C1" LIKE "T1"."C2"

注※2

スカラ関数CONTAINS(同義語検索指定を指定していない場合,または同義語検索指定を指定しているが,検索文字列に対して同義語が存在しない場合が該当)に,次に示す形式の検索文字列を指定したときは,この条件は該当しません。

  • 検索文字列に空文字だけを指定している場合

    (例1)CONTAINS("C1",'""')>0

    (例2)CONTAINS("C1",'IGNORECASE("")')>0

    (例3)CONTAINS("C1",'SORTCODE("")')>0

    (例4)CONTAINS("C1",'WORDCONTEXT("")')>0

    (例5)CONTAINS("C1",'WORDCONTEXT_PREFIX("")')>0

  • 検索文字列に1文字だけを指定している場合

    (例1)CONTAINS("C1",'"A"')>0

    (例2)CONTAINS("C1",'IGNORECASE("A")')>0

    (例3)CONTAINS("C1",'SORTCODE("A")')>0

    (例4)CONTAINS("C1",'WORDCONTEXT("A")')>0

    (例5)CONTAINS("C1",'WORDCONTEXT_PREFIX("A")')>0

    スカラ関数CONTAINSに同義語検索指定を指定し,検索文字列に対して同義語が存在する場合でも,「A」のような1文字の同義語が存在するときは,上記の条件には該当しません。

  • スカラ関数CONTAINSにワード検索指定が指定されていて,次の記号を取り除くと1文字以下になる検索文字列が指定されている場合

    • 半角空白(0x20),タブ(0x09),改行(0x0A),復帰(0x0D),ピリオド,疑問符,感嘆符を含む1バイトの記号(0x210x2F0x3A0x400x5B0x600x7B0x7E)

    (例1)CONTAINS("C1",'WORDCONTEXT("###A")')>0

    (例2)CONTAINS("C1",'WORDCONTEXT_PREFIX("###A")')>0

注※3

論理演算子ORに含まれるすべての条件が,LIKE述語,LIKE_REGEX述語,またはスカラ関数CONTAINSを使用した条件である必要があります。また,論理演算子ORに含まれるすべての列は,選択対象となるテキストインデクスのインデクス構成列に含まれている必要があります。

注※4

次に示すどちらかの場合は,CREATE INDEX文でCORRECTIONRULE(テキストインデクス表記ゆれ補正指定)を指定して定義したテキストインデクスだけが対象になります。

  • FLAGIGNORECASE(またはI)を指定したLIKE_REGEX述語を指定した場合

  • 表記ゆれ補正検索指定を指定したスカラ関数CONTAINSを指定した場合

注※5

LIKE_REGEX述語の正規表現文字列に指定した文字が1文字以下の場合,この条件は該当しません。

注※6

論理演算子ORに含まれるすべての列は,選択対象となるB-treeインデクスのインデクス構成列に含まれている必要があります。また,論理演算子ORに指定される述語の数や条件の形式によっては,インデクスの優先順位が上下することがあります。

注※7

LIKE条件を指定するインデクス構成列のデータ型が可変長文字列型で,かつ次に示す形式のパターン文字列の場合はこの条件に該当しません。

  • 末尾に特殊文字(パーセント)が指定されていない場合

    (例1)"C1" LIKE '%BCD'

    (例2)"C1" LIKE '%BCD_'

  • 末尾の特殊文字(パーセント)の前に半角空白,または特殊文字_(下線)が指定されている場合

    (例1)"C1" LIKE '%BCD△%'

    (例2)"C1" LIKE '%BCD_%'

    (凡例)△:半角空白

注※8

ワード検索用のテキストインデクスだけが,検索時に使用されるインデクスの選択対象になります。

(2) インデクスの選択規則

SQL文の実行時に使用されるインデクスは,「(1) インデクスの優先順位」で説明したインデクスの優先順位だけでは決まりません。ここで説明する条件なども加えて,使用されるインデクスが総合的に決定されます。

(a) B-treeインデクスの選択規則

B-treeインデクスの選択規則を次の表に示します。

なお,選択規則は,1番目の規則で判定できなければ2番目の規則を適用するというように,1番目から順に判定されます。

表5‒2 B-treeインデクスの選択規則

選択規則

条件指定方法

1

ユニークインデクスのすべての列に=条件を指定している

2

サーチ条件の先頭から連続する=条件の中に,=結合条件が含まれている方を優先する

3

B-treeインデクスの第1構成列にサーチ条件が指定されているインデクス同士の場合は,そのサーチ条件の優先順位に従う

4

サーチ条件の数が多い方を優先する

5

キー条件の数が多い方を優先する

6

インデクス構成列数が少ない方を優先する(ただし,選択規則1に該当するインデクス同士の場合は,インデクス構成列数が多い方を優先する)

7

SQL文上で前に指定された条件をサーチ条件に使用している方を優先する

8

作業表を作らない方を優先する

9

ユニークインデクスを優先する(ただし,サーチ条件が指定されていないインデクス同士の場合は,非ユニークインデクスを優先する)

10

インデクスのキー長が短い方を優先する

11

「選択規則1から10」以外は内部処理に依存してB-treeインデクスが選択される

サーチ条件とキー条件については,「5.4.1 B-treeインデクスによる評価方式」を参照してください。

(b) テキストインデクスの選択規則

テキストインデクスの選択規則を次の表に示します。

なお,選択規則は,1番目の規則で判定できなければ2番目の規則を適用するというように,1番目から順に判定されます。

表5‒3 テキストインデクスの選択規則

選択規則

条件指定方法

1

  • テキストインデクスで評価可能なLIKE述語を指定した条件の指定数が多い方を優先する

  • テキストインデクスで評価可能なLIKE_REGEX述語を指定した条件の指定数が多い方を優先する

  • テキストインデクスで評価可能なスカラ関数CONTAINSを指定した条件の指定数が多い方を優先する

2

  • LIKE述語のパターン文字列が長い方を優先する

  • LIKE_REGEX述語の正規表現文字列が長い方を優先する

  • スカラ関数CONTAINSの検索文字列が長い方を優先する

3

インデクス構成列の定義長が短い方を優先する

4

  • テキストインデクスで評価可能なOR条件に指定されているLIKE述語,LIKE_REGEX述語,およびスカラ関数CONTAINSのうち,指定数が少ない方を優先する

  • 同義語検索指定を指定したスカラ関数CONTAINSが指定されている場合は,指定数に検索文字列に対する同義語数を加算して比較する

5

「選択規則1から4」以外は,内部処理に依存してインデクスが選択される

(c) 留意事項

  • 取得したコスト情報などから,HADBがインデクスを有効に利用できないと判断したときは,ここで説明した選択規則とは異なる扱いをすることがあります。

  • WHERE句の探索条件や,結合表のON 探索条件に,否定の述語だけしか指定されていない場合など,HADBがインデクスを有効に利用できないと判断したときは,インデクスが使用されないことがあります。