
お世話になっております。SQLSERVER初心者です。
NULLを含む列COL1を検索条件に入れる場合、
パフォーマンスの観点から
WHERE COL1 IS NULL とするのではなく
WHERE ISNULL(COL1,'') = '' とするよう有識者から言われました。
そこで質問なのですが、
(1)IS NULL は基本的に上記のように変換したほうが早くなるのですか?
(2)COL1にもしインデックスが設定されていたとしても、上記の場合だとどちらも効かないですよね?
詳しい方おしえてください。
よろしくおねがいします。
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によって異なります。
この回答への補足
あ
すいません表示されました。
GUIで非常に見やすいですね。
読み方も徐々に勉強していきたいと思います。
ありがとうございました。
ありがとうございます。
なるほど(1)の方がはやそうですね。実際のsqlにもあてはめてみます。
>ManagementStudioでSQL実行時に「実際の実行プランを含める」のオプションつきで実行してみてください。
オプションつけたのですが、
実行プランのウィンドウが表示されません。。
よく分かりません、、(泣)
ありがとうございました。
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)ではなくなるため、オプティマイザがいかなる状況でもそのインデックスを選択しなくなります。
コストとパフォーマンスがダイレクトに同じだとはいいませんが、インデックスを使った場合のコストはフルスキャン時の数分の一以下になります。
ありがとうございます。
非常に詳しい解説をいただき助かりました。
>検索キーに関数を被せてしまうと・・・
やはりこの点はoracleなどと同じみたいです。
>2つの条件の結果は異なります。
結果が異なる点は認識しています。
仕様上問題ないことは確認取れてます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
seoについておしえてください
-
mysql IN句に1データだけ指定...
-
インデックスの再構築の意味っ...
-
年と月が別カラムの場合のSQL
-
MySQLとSQLServerの性能の違い...
-
【SQLServer】IS NULLのパフォ...
-
「マスタ」と「テーブル」の違...
-
ACCESS2007 フォーム 「バリア...
-
SI Object Browserのテーブルス...
-
ACCESSのSQLで、NULLかNULLでな...
-
クエリのキャンセルがいつにな...
-
3つ以上のテーブルをUNIONする...
-
DataTableから条件を満たした行...
-
SELECT文でのデッドロックに対...
-
オラクルではできるのにSQLSERV...
-
コンボボックスで入力したもの...
-
Access 削除クエリが重い
-
accessのロック
-
Accessでの禁止文字チェック
-
データの二重表示の原因
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インデックスの再構築の意味っ...
-
mysql IN句に1データだけ指定...
-
ビューにインデックスを設定で...
-
【SQLServer】IS NULLのパフォ...
-
主キーにインデックスは貼らな...
-
コクヨ タイトルブレーンでイ...
-
年と月が別カラムの場合のSQL
-
Oracleでの検索スピード
-
インデックスの領域について
-
ホームページがGOOGLEにインデ...
-
cron設定について
-
インデックスがすぐに壊れます…
-
サブクエリの使い方を教えて下...
-
効率的なインデックスのつけ方は?
-
Movable TypeとNamazuについて
-
[ BETWEEN ] vs [ >= AND <= ]
-
Google検索はなぜ早い?
-
リリポップサーバーの独自ドメ...
-
intel 945Pチップセットのパフ...
-
インデックスホールディングス...
おすすめ情報