2012-01-19 211 views
10

我在MS SQl服務器2008中使用ISNULL,因爲我的表太大了,是否使用ISNULL可能會導致性能下降?在SQL Server中使用ISNULL()時是否存在任何性能問題?

在此先感謝

+4

你不能測試看看嗎? –

+1

取決於很多事情,一如既往。你如何使用它,你在哪裏使用它,你的查詢是什麼。更多細節可能會有幫助 – Paddy

+0

@SergioTulentsev我正在進行一個增強項目。所以我們添加了一些新的colomns到tbls。那將是空的。可用於開發的數據只有少數。生產數據庫非常龐大。我無法訪問它。 – kbvishnu

回答

8

如果你需要使用它,那麼ISNULL和COALESCE一樣或CASE的替代品之間的差異是微不足道的。不用擔心

任何差異都來自於數據類型的處理方式。 COALESCE/CASE可以添加隱式數據類型轉換,而ISNULL則有更簡單的規則。

編輯

ISNULL在SELECT列表打壓NULLS是微不足道的。主要工作將在處理行和數據時完成。額外的ISNULL將無法衡量:請勿optimise prematurely

+0

可以看到評論 – kbvishnu

+1

正如對這篇文章的另一個答案,ISNULL函數具有顯着不同的性能配置文件時用於SELECT和用在WHERE或JOIN子句中。我的經歷證實了這一點。 –

+0

@DavidAlpert同意。這很容易被誤用 – gbn

9

是的,它可以。爲了優化是更好的重寫查詢(如果可能的話),以形成

(Field = @x OR @x IS NULL) 

因爲在某些情況下使用函數從優化防止使用統計數據,有時被迫隱式數據類型轉換

+0

可以使用我的查詢 – kbvishnu

+0

: - 從tbl中選擇oldcol,isnull(newcol,0)'a'。所以我在這裏使用ISNULL。你能否根據你的問題解釋一點點。謝謝 – kbvishnu

+2

在你的情況下,使用ISNULL的效果可以忽略 –

0

因爲它已經提到的已經這取決於在您的查詢中如何以及在哪裏使用它。可能你可能想要顯示你在查詢中使用它的方式。

此外,我建議你到過這 - What makes a SQL statement sargable?

35

select-clause中的ISNULL()對性能有着可忽略的影響。 另一方面,where子句可能會對性能產生非常巨大的影響,因爲它會阻止優化器在該列上使用索引。

where isnull(col1, 0) = 0 -- unable to use index, because every 
          -- row has to be evaluated 

where col1 = isnull(@myVar, 0) -- index will be used, since isnull(@myVar, 0) 
           -- returns the same static value for every row and 
           -- not every row has to be evaluated by the function. 

因此,當在where子句中使用isnull()時,評估它是否阻止查詢優化器使用索引。如果是這樣,請考慮創建一個帶有結果的計算列,如果isnull(col1,0)並索引計算列並在where子句中使用它。

+0

請注意,這兩個條件不會給出相同的結果。 – Atario

1

避免在where子句中使用isNull。請參閱This article

+0

嘿那裏 - 這個問題已經有了一個可以接受的答案。這是很好的信息,但作爲評論會更好:) – landons

+0

我沒有得到那篇文章。它正在看裸體列。 Isnull(@someVar,0)不應該很貴。 Isnull(someColumn,0)可能很昂貴,如果這樣做不會使用索引。 –

+0

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18966014) – derloopkat

1

是有性能問題據我所知,在SQL Server 2012工作室

的問題是很明顯的,當我在組合使用ISNULLOVER。在優化之後(即將ISNULL放入子查詢中,我使用OVER)運行時間從(估計的)25.2小時減少到102秒。

我的猜測是ISNULL可以在整個列上運行(例如,在普通的ol'SELECT)中。但是,當您使用OVER運行時,它每次都會被重新調用,從而拖慢性能。

尚未準備好進一步鑽取。簡單地把它放在這裏供他人蔘考。

相關問題