哪个更快COALESCE或ISNULL?

时间:2010-02-18 09:54:41

标签: sql-server performance

我理解这些函数之间的区别,但我的问题是,当检查单个空值时,ISNULL会比使用COALESCE更快吗?

e.g

COALESCE(SELECT TOP 1 SomeValue FROM SomeTable, 0)

VS

ISNULL(SELECT TOP 1 SomeValue FROM SomeTable, 0)

6 个答案:

答案 0 :(得分:13)

快速浏览一下这是很有意思的,看看对于两者之间的性能进行了多次不同的比较。我认为Adam Machanic的this博客文章在对此进行的性能基准测试中是最准确的。主题,底线是:

  

......而且ISNULL看起来很漂亮   始终优于COALESCE   平均10%或12%

然而,我和他接着说的那样有着相同的观点 - 差异可以忽略不计 - 例如在他的测试中,一百万人的处决平均显示出0.7秒的差异。这值得么?我建议可能有更大的优化领域。但阅读这篇文章,这是一个很好的阅读。

答案 1 :(得分:7)

在这种情况下,ISNULL是最佳选择。因为,SQL Server将COALESCE函数解释为CASE语句。那么,你的查询

COALESCE(选择TOPT SomeValue来自SomeTable,0)

将由SQL Server编写为

  1. CASE
  2. WHEN( SELECT TOP 1 SomeValue from SomeTable )IS NOT NULL
  3. 那么( SELECT TOP 1 SomeValue from SomeTable
  4. ELSE 0
  5. END
  6. 如果你观察到上述解释," SomeTable"将被扫描两次。但ISNULL只会被评估一次。

答案 2 :(得分:3)

我认为

ISNULL会更快,因为它本身的功能/代码实现较少,使其比COALESCE更快

答案 3 :(得分:1)

请检查链接 如果选择ISNULL倾向于生成比COALESCE更有效的查询计划,则更喜欢ISNULL而不是COALESCE

  1. <强> ISNULL Vs COALESCE

  2. <强> ISNULL vs COALESCE speed test

  3. 请检查效果 ISNULL vs. COALESCE

答案 4 :(得分:0)

为什么它的价值你有一个非常具体的用例,所以我使用了一个实际问题的样本,在第一个值的表上想到并控制其他变量的脚本。我假设someval是一个int,因为你使用了0.我的建议是你选择你特定的someval / sometable case并自己做测试。

declare @val  int = 0;
declare @time1  Datetime2 = getdate();
declare @time2  Datetime2 = getdate();
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
 Select @val = ISNULL((SELECT TOP 1 LocationID FROM location), 0)
 Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);
Select @MyCounter = 0;
Select @time1 = GETDATE();
while @MyCounter < 1000000
Begin
 Select @val = COALESCE((SELECT TOP 1 LocationID FROM Location), 0)
 Select @MyCounter +=1;
END
Select @time2 = GETDATE();
Print datediff(millisecond,@time1,@time2);

结果非常引人注目,isnull为11270,cowellce为18930。作为第二次测试,反转循环的顺序产生18260用于合并,10810用于isnull。对于特定情况,我会说isnull显然更快。

这并不是说在任何其他特定情况下都会更好。使用直接值,或nvarchars或位而不是int,或者不是主键的列,或者Nesting isnull与添加参数以进行合并可能会改变一些事情。

这只能解决问题。

答案 5 :(得分:-3)

我刚刚对自己的数据库进行了测试。大约700k行。

SELECT COUNT(*) FROM table WHERE COALESCE(field_1,field_2,field_3,field_4) IS NOT NULL

在56秒内获得12106的结果。

SELECT COUNT(*) FROM table WHERE field_1 IS NOT NULL OR field_2 IS NOT NULL OR field_3 IS NOT NULL OR field_4 IS NOT NULL

在0.00秒内获得12106的结果。