我理解这些函数之间的区别,但我的问题是,当检查单个空值时,ISNULL会比使用COALESCE更快吗?
e.g
COALESCE(SELECT TOP 1 SomeValue FROM SomeTable, 0)
VS
ISNULL(SELECT TOP 1 SomeValue FROM SomeTable, 0)
答案 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编写为
如果你观察到上述解释," SomeTable"将被扫描两次。但ISNULL只会被评估一次。
答案 2 :(得分:3)
ISNULL
会更快,因为它本身的功能/代码实现较少,使其比COALESCE
更快
答案 3 :(得分:1)
请检查链接
如果选择ISNULL
倾向于生成比COALESCE
更有效的查询计划,则更喜欢ISNULL
而不是COALESCE
。
<强> ISNULL Vs COALESCE 强>
请检查效果: 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
的结果。