プロが教える店舗&オフィスのセキュリティ対策術

お世話になっております。SQLSERVER初心者です。

NULLを含む列COL1を検索条件に入れる場合、
パフォーマンスの観点から

WHERE COL1 IS NULL とするのではなく
WHERE ISNULL(COL1,'') = '' とするよう有識者から言われました。

そこで質問なのですが、

(1)IS NULL は基本的に上記のように変換したほうが早くなるのですか?
(2)COL1にもしインデックスが設定されていたとしても、上記の場合だとどちらも効かないですよね?

詳しい方おしえてください。
よろしくおねがいします。

A 回答 (3件)

試しにこちらの適当なテーブルに索引をつけて検索してみました。



(1)WHERE COL1 IS NULL
INDEX SEEKになりました

(2)WHERE ISNULL(COL1,'') = ''
INDEX SCANになりました

INDEX SEEKなので(1)の方が効率がよさそうです。
ManagementStudioでSQL実行時に「実際の実行プランを含める」のオプションつきで実行してみてください。

でも、(2)は長さ0の空文字も対象にするから(1)と(2)は結果が変りますよね。このことを考慮してますか?

※長さ0の文字列とNULLを区別するかどうかはDBによって異なります。

この回答への補足


すいません表示されました。

GUIで非常に見やすいですね。
読み方も徐々に勉強していきたいと思います。

ありがとうございました。

補足日時:2009/08/10 15:55
    • good
    • 0
この回答へのお礼

ありがとうございます。
なるほど(1)の方がはやそうですね。実際のsqlにもあてはめてみます。

>ManagementStudioでSQL実行時に「実際の実行プランを含める」のオプションつきで実行してみてください。

オプションつけたのですが、
実行プランのウィンドウが表示されません。。
よく分かりません、、(泣)

ありがとうございました。

お礼日時:2009/08/10 13:18

そのアドバイスはかなり疑問だと思います。



・そもそもNULL値を検索するということは、その列はNULL値が認められているということです。
 SQL Serverでは、(Oracleとは違い)NULLと空文字は別扱いですから、データに空文字とNULLの両方が含まれる場合、2つの条件の結果は異なります。

・Col1にインデックスがない場合、Col1 IS NULLとISNULL(Col1,'')=''のコストは殆ど変わりません。
 どちらにしても主キーに対するフルスキャンが選択されるためです。

・Col1にインデックスがある場合、
 Col1 IS NULLとした場合もそれだけではインデックスを使わない可能性がありますが、Col1 IS NULL OR Col1=''とした場合、インデックスを選択する可能性が高くなります
 検索キーに関数を被せてしまうとSARG(Search Argument)ではなくなるため、オプティマイザがいかなる状況でもそのインデックスを選択しなくなります。
 コストとパフォーマンスがダイレクトに同じだとはいいませんが、インデックスを使った場合のコストはフルスキャン時の数分の一以下になります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
非常に詳しい解説をいただき助かりました。

>検索キーに関数を被せてしまうと・・・

やはりこの点はoracleなどと同じみたいです。

>2つの条件の結果は異なります。

結果が異なる点は認識しています。
仕様上問題ないことは確認取れてます。

ありがとうございました。

お礼日時:2009/08/10 13:11

(1)は分かりませんが


SQLSERVERはデフォルトでは索引にnull値を含めます。「is null」検索時
もインデックスを使用する場合があります。
    • good
    • 0
この回答へのお礼

そうなんですか、親切ですね~
ありがとうございました。

お礼日時:2009/08/06 16:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す