2011-10-24 288 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