2011-10-24 94 views
5

我們有一個表或NULL或「Accepted」作爲值。我的查詢返回大約250行。ISNULL減慢查詢速度

如果我添加一個WHERE條件的 -

AND Description = 'Accepted' 

我的250行返回2秒。

但是,如果我添加一個WHERE條件的 -

ISNULL(Description, '') = 'Accepted' 

我的250行中47秒返回。

有沒有人遇到過使用ISNULL函數的性能問題?不幸的是,我在編程上限於此時必須使用ISNULL。

+1

出於興趣,你是如何「編程限制」? –

回答

12

當你在一個函數中包含一個字段時,它會改變優化器必須運行的方式並強制它忽略索引。

在這裏看到:What makes a SQL statement sargable?

+0

太棒了。謝謝! – duckmike

+0

+1給實際閱讀整篇文章的一個評論者+1 –

7

您還可以完全利用繞過功能:

WHERE (Description = 'Accepted' OR Description IS NULL)

2

如果你想在WHERE條件使用,使用IS NULL,不ISNULL

SELECT field FROM table WHERE description is null

或者相反

SELECT場FROM表WHERE NOT描述爲空

3

在WHERE條件犯規利用

ISNULL(Description, '') = 'Accepted' 

在這情況下,任何意義。如果描述爲空,原始where子句中的

AND Description = 'Accepted' 

仍然足夠。 您基本上在描述爲空的每一行中比較''和'已接受'。

請詳細說明您試圖完成的查詢,我認爲您可能會走錯方向。

+0

+1指出出血很明顯:當NULL與實際相同時,評估爲false/unknown。我可能也忽略了這一點。 – gbn