お世話になっております。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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
ビューで引数を使いたい
SQL Server
-
-
4
含まない言い方ってどうしたらいいんでしょうか
日本語
-
5
DELETE文でFROM句を省略した場合
その他(データベース)
-
6
SELECT 文 GROUP での1件目を取得
SQL Server
-
7
日付の大小の表現
日本語
-
8
SQLServerのselect文でデータ数1万くらいのDBから
SQL Server
-
9
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
10
VIEWに対してWHERE句をつける
MySQL
-
11
特定条件でWHERE句の条件を変更したい
SQL Server
-
12
datetime型でNULL値を入れたい。
SQL Server
-
13
クエリのキャンセルがいつになっても終わらない
SQL Server
-
14
SQLServerで文字列の末尾からある位置で取出
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[ BETWEEN ] vs [ >= AND <= ]
-
【SQLServer】IS NULLのパフォ...
-
ビューにインデックスを設定で...
-
主キーにインデックスは貼らな...
-
indexの使用頻度を調べる方法
-
年と月が別カラムの場合のSQL
-
ホームページがGOOGLEにインデ...
-
インデックスの再構築の意味っ...
-
mysql IN句に1データだけ指定...
-
「マスタ」と「テーブル」の違...
-
データの二重表示の原因
-
ACCESSのSQLで、NULLかNULLでな...
-
SELECT時の行ロックの必要性に...
-
2つのテーブルから条件に一致...
-
Access 1レコードずつcsvで出力...
-
3つ以上のテーブルをUNIONする...
-
オラクルではできるのにSQLSERV...
-
Accessのリンクテーブルについて
-
SELECT文でのデッドロックに対...
-
Oracleの排他制御について教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[ BETWEEN ] vs [ >= AND <= ]
-
主キーにインデックスは貼らな...
-
【SQLServer】IS NULLのパフォ...
-
インデックスの再構築の意味っ...
-
mysql IN句に1データだけ指定...
-
ビューにインデックスを設定で...
-
年と月が別カラムの場合のSQL
-
サーバ負荷を抑える大量データ...
-
outlook2007 検索できないんです
-
コクヨ タイトルブレーンでイ...
-
ホームページがGOOGLEにインデ...
-
画像の赤丸で囲っている、角丸...
-
MS-DOS時代のデーターベ...
-
Google検索はなぜ早い?
-
複数のDBでjoinする場合のindex...
-
テキスト項目255ケタのメリット...
-
数学でunprimedとは何を意味し...
-
『ラミネートインデックスシー...
-
SQLiteで... like を早くする
-
SQL関数とレスポンスについて
おすすめ情報