5.2.4 インデクスが使用されないケース
探索条件に次の条件を指定している場合,インデクスが使用されません。なお,例に示すC1,C2は表の列名を意味しています。
-
否定の条件を指定している場合
次に示す例のように,否定の条件を探索条件に指定している場合,C1列をインデクス構成列とするインデクスが定義されていても,そのインデクスは使用されません。
(例)
WHERE "C1"<>100 WHERE "C1" IS NOT NULL WHERE "C1" NOT LIKE 'ABC%' WHERE "C1" NOT IN (10,20,30) WHERE "C1" NOT BETWEEN 20 AND 40
-
論理演算子NOTを指定している場合
(例)
WHERE NOT ("C1"=100)
-
四則演算やCASE式などのスカラ演算を含む条件を指定している場合
次に示す例のように,四則演算やCASE式などのスカラ演算を含む条件を探索条件に指定している場合,C1列をインデクス構成列とするインデクスが定義されていても,そのインデクスは使用されません。
(例)
WHERE C1*10=200
ただし,スカラ演算の指定方法によっては,探索条件が自動的に等価変換され,インデクスが使用されることがあります。スカラ演算に関する等価変換については,「5.11.5 スカラ演算に関する等価変換」を参照してください。
なお,スカラ演算の中に定数だけを指定している場合,そのスカラ演算は定数として扱われることがあります。定数と等価なスカラ演算については,マニュアルHADB SQLリファレンスの値式の指定形式および規則の規則にある表定数と等価な値式となる条件を参照してください。
-
外への参照列を含む副問合せが指定されているIN副問合せを指定している場合
(例)
WHERE "T1"."C1" IN (SELECT "C1" FROM "T2" WHERE "C2"="T1"."C2")
-
外への参照列を含む副問合せが指定されている=ANYの限定述語を指定している場合
(例)
WHERE "T1"."C1"=ANY(SELECT "C1" FROM "T2" WHERE "C2"="T1"."C2")
-
外への参照列を含む副問合せが指定されている=SOMEの限定述語を指定している場合
(例)
WHERE "T1"."C1"=SOME(SELECT "C1" FROM "T2" WHERE "C2"="T1"."C2")
-
=ANYまたは=SOMEを除く限定述語を指定している場合
(例)
WHERE "C1"<>ANY(SELECT "C1" FROM "T2") WHERE "C1"<>SOME(SELECT "C1" FROM "T2") WHERE "C1"=ALL(SELECT "C1" FROM "T2")
-
EXISTS述語を指定している場合
(例)
WHERE EXISTS(SELECT * FROM "T2")
-
LIKE述語のパターン文字列に次の指定をしている場合
-
パターン文字列に特殊文字の%だけを指定している場合
(例)
WHERE "C1" LIKE '%'
-
パターン文字列に空文字だけを指定している場合
(例)
WHERE "C1" LIKE ''
-
パターン文字列に,特殊文字以外の文字を2文字以上連続して指定していない場合
(例)
WHERE "C1" LIKE '%A%' WHERE "C1" LIKE '%A%B%'
-
一致値に指定した列と同じ表の列をパターン文字列に指定している場合
(例)
WHERE "T1"."C1" LIKE "T1"."C2"
上記の例のような指定をしている場合,C1列をインデクス構成列とするテキストインデクスが定義されていても,そのテキストインデクスは使用されません。
-