
お世話になっております。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で質問しましょう!
似たような質問が見つかりました
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Excel(エクセル) Excel 、この式はどのように解釈すればいいのでしょうか 4 2023/02/03 08:53
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- Access(アクセス) accessの日付フィールドから前年度だけを取り出したい 3 2022/04/13 23:13
- 英語 L-PRF can be obtained by manual or automated metho 1 2022/04/08 09:39
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
outlook2007 検索できないんです
-
コクヨ タイトルブレーンでイ...
-
インデックスの再構築の意味っ...
-
年と月が別カラムの場合のSQL
-
mysql IN句に1データだけ指定...
-
「マスタ」と「テーブル」の違...
-
3つ以上のテーブルをUNIONする...
-
AccessのテーブルをSQL Server...
-
SELECT時の行ロックの必要性に...
-
SELECT文でのデッドロックに対...
-
重複レコードの削除
-
非連結サブフォームのレコード...
-
ACCESSにてテーブルをEXCEL形式...
-
ユニオンクエリの結果をテーブ...
-
ACCESSのBookmarkプロパティの...
-
ACCESS2007 フォーム 「バリア...
-
数百万件レコードのdelete
-
ACCESSのODBCリンクテーブルに...
-
Accessのリンクテーブルについて
-
Access VBA [リモートサーバー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysql IN句に1データだけ指定...
-
インデックスの再構築の意味っ...
-
ビューにインデックスを設定で...
-
【SQLServer】IS NULLのパフォ...
-
コクヨ タイトルブレーンでイ...
-
主キーにインデックスは貼らな...
-
[ BETWEEN ] vs [ >= AND <= ]
-
年と月が別カラムの場合のSQL
-
outlook2007 検索できないんです
-
数学でunprimedとは何を意味し...
-
Google検索はなぜ早い?
-
MySQLでFullTextインデックスの...
-
ホームページがGOOGLEにインデ...
-
MS-DOS時代のデーターベ...
-
500Gのテキストファイルから全...
-
テキスト項目255ケタのメリット...
-
インデックスについて
-
サーバ負荷を抑える大量データ...
-
Oracleでの検索スピード
-
インデックスがすぐに壊れます…
おすすめ情報