2016-11-10 7 views
3

08:15に150万行を返す次の大きな選択クエリがあります。私は約290列を選択するクエリを最適化する必要があり、私は速度を向上させるために列の数を減らすことはできません。SQL Serverに最適化された大規模クエリとISNULL where節

select Column1 ... Column290 
from dob.table1 
where (ISNULL(Column50, 1) = 1) 

私は、オプティマイザはインデックスを使用しますが、正しいスキャンする頼られていないためWHERE句で使用される場合ISNULLはパフォーマンスコストを持っていることを読んだことがありますか?

私は、CTEで使用して

IP_Column50 = case when IP_Column50 is null then else IP_Column50 end 

select * 
from cte 
where IP_Column50 = 1 

だけに、私のクエリを書き換えを設定しようとした

WHERE (ISNULL(Column50, 1) = 1) 

を書き換える方法を把握しようとしています

CTEには時間がかかりました。

私がもしそうなら、このアプローチについて

を読んでISNULL(COL1、0)およびインデックス計算列ならば、結果と計算列を作成することを検討して、WHERE句で

をそれを使用しかし、私これを実装する方法がわかりません。このクエリを最適化するとどんな助けにもなります。

おかげ

+0

'Column50'のデータ型は? –

答えて

1

はあなたがあまりにも単一のクエリでこれを行うことができますUNION

select Column1 ... Column290 from dob.table1 where Column50 is null 
union 
select Column1 ... Column290 from dob.table1 where Column50 = 1 
2

を使用してください。このような。

select Column1 ... Column290 
from dob.table1 
where Column50 = 1 
OR Column50 IS NULL 

これは、すべてのクエリをキャッチするタイプであるため、問題になる可能性がありますが、このようなチェックが必要な条件が複数ある場合は、この記事をチェックしてください。

http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

+0

ベストアンサーとダブルタイムでキャッチすべての教育 – scsimon

1

あなたはちょうどあなたが言ったように

select Column1 ... Column290 
from dob.table1 
where Column50 IS NULL OR (Column50 IS NOT NULL AND Column50 = 1) 

を行うとhereを示すようにでき、句がNULL IS使用するよりも効率が低いところでISNULLを使用しているようです。

+2

かっこの中で= 1とNOT NULLの両方をチェックするのはなぜですか?定義では、値が1の場合、NULLにすることはできません。 :) –

+0

@SeanLange私はあなたがこのケースでは正しいと思うが、今はそれをテストする方法がない= /それは、nullを言った関係の比較で問題を避けるためにnullを比較すると、私の古いhabbitだ。 (http://stackoverflow.com/a/1833975/4905310)。 –

+0

@SeanLangeあなたはこのケースに絶対に当てはまります。ちょうどテストされ、実際には、IS NULLとIS NULLを同時にチェックする必要はありませんでした。電話をありがとう。 –

関連する問題