• ベストアンサー

【SQLServer】IS NULLのパフォーマンス

お世話になっております。SQLSERVER初心者です。 NULLを含む列COL1を検索条件に入れる場合、 パフォーマンスの観点から WHERE COL1 IS NULL とするのではなく WHERE ISNULL(COL1,'') = '' とするよう有識者から言われました。 そこで質問なのですが、 (1)IS NULL は基本的に上記のように変換したほうが早くなるのですか? (2)COL1にもしインデックスが設定されていたとしても、上記の場合だとどちらも効かないですよね? 詳しい方おしえてください。 よろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.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によって異なります。

mamiyak
質問者

お礼

ありがとうございます。 なるほど(1)の方がはやそうですね。実際のsqlにもあてはめてみます。 >ManagementStudioでSQL実行時に「実際の実行プランを含める」のオプションつきで実行してみてください。 オプションつけたのですが、 実行プランのウィンドウが表示されません。。 よく分かりません、、(泣) ありがとうございました。

mamiyak
質問者

補足

あ すいません表示されました。 GUIで非常に見やすいですね。 読み方も徐々に勉強していきたいと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

そのアドバイスはかなり疑問だと思います。 ・そもそも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)ではなくなるため、オプティマイザがいかなる状況でもそのインデックスを選択しなくなります。  コストとパフォーマンスがダイレクトに同じだとはいいませんが、インデックスを使った場合のコストはフルスキャン時の数分の一以下になります。

mamiyak
質問者

お礼

ありがとうございます。 非常に詳しい解説をいただき助かりました。 >検索キーに関数を被せてしまうと・・・ やはりこの点はoracleなどと同じみたいです。 >2つの条件の結果は異なります。 結果が異なる点は認識しています。 仕様上問題ないことは確認取れてます。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

(1)は分かりませんが SQLSERVERはデフォルトでは索引にnull値を含めます。「is null」検索時 もインデックスを使用する場合があります。

mamiyak
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A