2016-11-10 72 views
3

我有以下大型select查詢,它在08:15返回150萬行。我需要優化查詢選擇大約290列,我不能減少列數以提高速度。SQL Server使用ISNULL優化大型查詢where子句

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

我已閱讀,ISNULL有性能上的成本,如果WHERE子句中使用,因爲優化器不使用索引,但訴諸掃描,是否正確?

我試圖找出如何

WHERE (ISNULL(Column50, 1) = 1) 

我試着用用CTE重寫,並設置

IP_Column50 = case when IP_Column50 is null then else IP_Column50 end 

,改寫我的查詢

select * 
from cte 
where IP_Column50 = 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,似乎在使用ISNULL Where子句比使用效率較低IS NULL。

+2

爲什麼在括號內檢查= 1和NOT NULL?根據定義,如果值是1,它不可能是NULL。 :) –

+0

@SeanLange我想你在這種情況下是正確的,但我現在沒有辦法測試它= /這只是我比較任何空值的一個老習慣,以避免[涉及所述空值的關係比較的任何問題] (http://stackoverflow.com/a/1833975/4905310)。 –

+0

@SeanLange你對這種情況絕對正確。經過測試,確實沒有必要同時檢查IS NULL和IS NOT NULL。感謝您的來電。 –