Observation: Non-indexable LIKE Predicate(監視レポート:LIKE述部が索引付けできない)

索引付けできないLIKE述部をコーディングしました。LIKE述部の最初の文字にワイルドカードを指定すると、Db2は索引を使用しません。検索ストリングの先行文字がLIKE述部で指定されている場合、DB2オプティマイザーは突き合わせ索引スキャンを使用できます。

DB2によりLIKE述語が索引付けできる形式であるとみなされるかどうかにかかわらず、有効な値が比較的小さい場合、LIKE述部をINまたはBETWEENでコーディングし直すことを考えてください。多くの場合、INやBETWEENの方が効率的です。

以下の例には、SAMPで始まるC1のすべての値を戻すLIKE述部が含まれています。

SELECT 
C1 
FROM 
T1 
WHERE 
C1 LIKE 'SAMP%' 

C1が有効な値を5つだけ含む場合、このステートメントを以下のように、IN述部を使用してコーディングし直すことができます。

SELECT
C1 
FROM 
T1 
WHERE 
C1 IN ('SAMP01', 'SAMP02', 'SAMP03', 'SAMP04', 'SAMP05') 

同様に、C1が有限の値(この例では、01~99まで)だけを含むことができる場合、このステートメントを以下のように、BETWEEN述部を使用してコーディングし直すことができます。

 

SELECT 

C1 

FROM 

T1 

WHERE 

C1 BETWEEN 'SAMP01' AND 'SAMP99' 

 

メモ:DB2は、ホスト変数の最初の文字にワイルドカードが含まれるかどうかを判断できます。ただし、DB2はホスト変数の実際の内容を実行時間になるまで認識できないため、Db2オプティマイザーは、索引が使用される可能性があることだけを示します。ホスト変数の値に基づき、実行時にDB2が選択したアクセス パスを以下に定義しています。

  • ホスト変数の値が有効な、ワイルドカード以外の文字で始まる場合、DB2では突き合わせ索引スキャンが使用されます。

  • ホスト変数の値が「%」または半角のスペースで始まり、クラスター化索引のクラスター率が80%以上の場合、DB2では非突き合わせ索引スキャンが使用され、クラスター率が80%未満の場合、表スペース スキャンが使用されます。