Hitachi

Hitachi Advanced Data Binder AP開発ガイド


5.3.2 検索時に使用されるレンジインデクスの例

〈この項の構成〉

(1) 例1

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1">10
[説明]

この例の場合,条件に合致するデータを含まないチャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。

(2) 例2

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
CREATE INDEX "RIDX2" ON "T1"("C2") IN "DBAREA01" EMPTY INDEXTYPE RANGE
CREATE INDEX "RIDX3" ON "T1"("C3") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1"=10 AND "C2">20 AND "C3">30
[説明]

この例の場合,条件に合致するデータを含まないチャンクおよびセグメントをスキップするために,レンジインデクスRIDX1RIDX2およびRIDX3が使用されます。

(3) 例3(レンジインデクスが使用されない例)

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1">"C2"
[説明]

比較演算子の左側と右側に同じ表の列が指定されている場合は,レンジインデクスは使用されません(条件に合致するデータを含まないチャンクおよびセグメントはスキップされません)。この例の場合,C1C2は表T1の列のため,レンジインデクスRIDX1は使用されません。

(4) 例4

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1" BETWEEN 10 AND 30
[説明]

この例の場合,条件に合致するデータを含まないチャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。

(5) 例5(レンジインデクスが使用されない例)

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1" BETWEEN "C2" AND "C3"
[説明]

値式1と同じ表の列が,値式2または値式3に指定されている場合は,レンジインデクスは使用されません(条件に合致するデータを含まないチャンクおよびセグメントはスキップされません)。この例の場合,C1C2C3は表T1の列のため,レンジインデクスRIDX1は使用されません。

(6) 例6

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1" IN (10,20,30)
[説明]

この例の場合,条件に合致するデータを含まないチャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。

(7) 例7(レンジインデクスが使用されない例)

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1" IN ("C2",20,30)
[説明]

値式1と同じ表の列が,値式2以降の値式に指定されている場合は,レンジインデクスは使用されません(条件に合致するデータを含まないチャンクおよびセグメントはスキップされません)。この例の場合,C1C2は表T1の列のため,レンジインデクスRIDX1は使用されません。

(8) 例8

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1" LIKE CURRENT_USER
SELECT * FROM "T1" WHERE "C1" LIKE ?
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC%'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC%E'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC%E%'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC%E%G'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC_'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC_E'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC_E_'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC_E_G'
SELECT * FROM "T1" WHERE "C1" LIKE 'ABC'
SELECT * FROM "T1" WHERE "C1" NOT LIKE ?
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC%'
SELECT * FROM "T1" WHERE "C1" LIKE 'AB\_C%' ESCAPE '\'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'AB\_C%' ESCAPE '\'
[説明]

上記の例の場合,どのSELECT文を実行しても,条件に合致するデータを含まないチャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。

LIKE述語に?パラメタを指定した場合はレンジインデクスが使用されますが,次に示す条件に該当しないパターン文字列を指定した場合は,レンジインデクスの効果はありません。

  • LIKEの場合

    ・'文字列%'(%は特殊文字)を先頭から含むパターン文字列

    ・'文字列_'(_は特殊文字)を先頭から含むパターン文字列

    %または_の特殊文字を含まないパターン文字列(完全一致)

  • NOT LIKEの場合

    ・'文字列%'(%は特殊文字)のパターン文字列

(9) 例9(レンジインデクスが使用されない例)

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1" LIKE '%ABC%'
SELECT * FROM "T1" WHERE "C1" LIKE '%ABC'
SELECT * FROM "T1" WHERE "C1" LIKE '_ABC_'
SELECT * FROM "T1" WHERE "C1" LIKE '_ABC'
SELECT * FROM "T1" WHERE "C1" NOT LIKE CURRENT_USER
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC%E'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC%E%'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC%E%G'
SELECT * FROM "T1" WHERE "C1" NOT LIKE '%ABC%'
SELECT * FROM "T1" WHERE "C1" NOT LIKE '%ABC'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC_'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC_E'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC_E_'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC_E_G'
SELECT * FROM "T1" WHERE "C1" NOT LIKE '_ABC_'
SELECT * FROM "T1" WHERE "C1" NOT LIKE '_ABC'
SELECT * FROM "T1" WHERE "C1" NOT LIKE 'ABC'
SELECT * FROM "T1" WHERE "C1" LIKE '%AB\_C%' ESCAPE '\'
SELECT * FROM "T1" WHERE "C1" LIKE 'A\%B@_C%'
                     ESCAPE CASE WHEN 10=? THEN '\' ELSE '@' END
SELECT * FROM "T1" WHERE "C1" NOT LIKE '%AB\_C%' ESCAPE '\'
[説明]

上記のすべてのSELECT文は,「表5‒4 レンジインデクスが使用される条件」の項番1のLIKE述語の条件を満たしません。したがって,レンジインデクスRIDX1は使用されません(条件に合致するデータを含まないチャンクおよびセグメントはスキップされません)。

(10) 例10(レンジインデクスが使用されない例)

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1"=10 OR "C2"=20
SELECT * FROM "T1" WHERE NOT("C1"=10)
[説明]

論理演算子ORまたはNOTを使用した条件中に指定されている場合は,レンジインデクスは使用されません(条件に合致するデータを含まないチャンクおよびセグメントはスキップされません)。

(11) 例11(レンジインデクスが使用されない例)

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "T1"."C1"+10=20
[説明]

レンジインデクスの構成列を含むスカラ演算を使用している場合は,レンジインデクスは使用されません(条件に合致するデータを含まないチャンクおよびセグメントはスキップされません)。

(12) 例12(レンジインデクスが使用されない例)

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1","T2","T3" WHERE "T1"."C1" BETWEEN "T2"."C2" AND "T3"."C3"
SELECT * FROM "T1","T2","T3" WHERE "T1"."C1" IN ("T2"."C2","T3"."C3")
[説明]

述語中に3つ以上の異なる表の列を指定している場合は,レンジインデクスは使用されません(条件に合致するデータを含まないチャンクおよびセグメントはスキップされません)。

(13) 例13

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1"("C2") IN "DBAREA01" EMPTY INDEXTYPE RANGE
CREATE INDEX "RIDX2" ON "T1"("C3") IN "DBAREA01" EMPTY INDEXTYPE RANGE
CREATE INDEX "RIDX3" ON "T2"("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" "X"
    WHERE "X"."C1"=ANY(SELECT "T2"."C1" FROM "T2"
                       WHERE "X"."C2"=10 AND "X"."C3"="T2"."C1")
[説明]

レンジインデクスRIDX1およびRIDX2のインデクス構成列(表T1C2列,C3列)は,外への参照列のため,レンジインデクスRIDX1およびRIDX2は使用されません。

レンジインデクスRIDX3は,表T2C1列(外への参照列ではない列)をインデクス構成列とし,条件に合致するデータを含まないチャンクおよびセグメントをスキップするために使用されます。

(14) 例14

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T2" ("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1","T2" WHERE "T1"."C1"<"T2"."C1"
SELECT * FROM "T1" INNER JOIN "T2" ON "T1"."C1"<"T2"."C1"
[説明]

T1を外表,表T2を内表とするネストループジョインが適用される場合,チャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。ネストループジョインの詳細については,「5.5.1 ネストループジョインとは」を参照してください。

(15) 例15

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T2" ("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1","T2" WHERE "T1"."C1"="T2"."C1"
SELECT * FROM "T1" INNER JOIN "T2" ON "T1"."C1"="T2"."C1"
[説明]

表の結合方式に,表T1を外表,表T2を内表とするハッシュジョインが適用される場合,チャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。ハッシュジョインの詳細については,「5.5.2 ハッシュジョインとは」を参照してください。

(16) 例16

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1" ("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" "X"
    WHERE EXISTS(SELECT * FROM "T2" WHERE "X"."C1"="T2"."C1")
[説明]

外への参照列を含む副問合せの処理方式にハッシュ実行が適用される場合,チャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。外への参照列を含む副問合せの処理方式のハッシュ実行の詳細については,「5.6.3 外への参照列を含む副問合せの処理方式とは」の「(3) ハッシュ実行」を参照してください。

(17) 例17

レンジインデクスの定義
CREATE INDEX "RIDX1" ON "T1" ("C1") IN "DBAREA01" EMPTY INDEXTYPE RANGE
SQL文の例
SELECT * FROM "T1" WHERE "C1" IN (SELECT "T2"."C1" FROM "T2")
SELECT * FROM "T1" WHERE "C1"=ANY(SELECT "T2"."C1" FROM "T2")
[説明]

外への参照列を含まない副問合せの処理方式にハッシュ実行が適用される場合,チャンクおよびセグメントをスキップするために,レンジインデクスRIDX1が使用されます。外への参照列を含まない副問合せの処理方式のハッシュ実行の詳細については,「5.6.1 外への参照列を含まない副問合せの処理方式とは」の「(4) ハッシュ実行」を参照してください。