
Oracle SQLチューニング(第30回)「NULL処理構文の理解と効率的なSQLの作成」(6/7回)
「NULL処理構文の理解と効率的なSQLの作成」の6回目は、「IS NOT NULL照会に対する改善方法検索」についてのお話です。それでは、始めましょう。
7.6 IS NOT NULL照会に対する改善方法検索
IS NOT NULL照会はSQL構成やカラムのインデックス構成情報により多くの性能偏差が発生しますが、最小限IS NOT NULLで問い合わせるカラムを利用したインデックス スキャンが効率的であるなら、IS NOT NULL照会条件をインデックス スキャンが可能な条件に変更する必要があります。 IS NOT NULL条件を変更する時はカラムのデータ タイプにより変更する方法が変わることになります。 今からインデックスを使えるようにIS NOT NULL条件を変更する方法とIS NOT NULL条件によるSQLの性能問題に対して調べてみることにしましょう。
7.6.1 多様なIS NOT NULL処理とSQL性能問題
7.6.1.1 CHAR(VARCAHR2)タイプであるカラムのIS NOT NULL
IS NOT NULLはカラムがNULLでないデータだけ抽出することを言います。 したがってCHARタイプであるカラムに対するIS NOT NULL照会はインデックスを使うことはできません。 したがって効率的なインデックス スキャンになることができるように、文字列のうち一番小さい値より大きい値を問い合わせるように変更するならば、インデックスを使用できない非効率は除去することができるようになります。
[IS NOT NULL 照会]
[IS NOT NULLと同じ照会SQL]
CHR関数は数値を引数として受け取り、文字を返す関数で、CHR(0)は文字列のうち最も小さい値を意味します。
7.6.1.2 DATEタイプであるカラムのIS NOT NULL
IS NOT NULLで照会されるDATEタイプであるカラムをインデックス スキャンが可能な構文に変更する方法は、カラムに存在できない一番小さい値を利用して問い合わせることです。
[IS NOT NULL照会]
[IS NOT NULLと同じ照会SQL]
7.6.1.3 NUMBERタイプであるカラムのIS NOT NULL
NUMBERタイプであるカラムのIS NOT NULL照会は0を基点にしてすべてのデータを抽出するように条件を変更すれば良いのです。
[IS NOT NULL照会]
[IS NOT NULLと同じ照会SQL]
7.6.2 結合処理時IS NOT NULLを活用すること
テーブル間結合を実行する時、各テーブルのカラムとカラムを比較して処理しますが、NULLを含まない値で比較することになるので、基本的に結合連結カラムはIS NOT NULL条件を有していることになります。
[単一テーブルのカラム比較とIS NOT NULL]
[テーブル結合とIS NOT NULL]
T2.C3 IS NOT NULLという条件はSQLにはありませんが、t1.c3 = t2.c3条件自体にT1.C3 IS NOT NULLとT2.C3 IS NOT NULL照会条件が含まれています。
もし、T2.C3列がNULL以外のデータが少ない場合は、T2.C3列に新しい索引を作成し、索引を使用できるように照会条件を変更することで効率的な実行が可能です。
-NOT_NULL_T2.C3に新規インデックスを生成する。
今回は、ここまでとなります。次回は、「'(BLANK)とNULLデータ処理」についてです。それでは、see you next time ^^