COALESCE与ISNULL的性能差异?


48

我已经看到很多人使用COALESCE函数代替ISNULL。通过互联网搜索,我发现COALESCE是ANSI标准,因此我们知道使用COALESCE的好处。但是,ISNULL似乎更易于阅读,因为它看起来更清楚自己在做什么。

我还意识到ISNULL有点棘手,因为它在不同的数据库服务器和不同的语言上有不同的作用。

在我看来,所有这些都归结为风格和标准。鉴于样式是主观的,是否有任何理由在ISNULL上使用COALESCE(反之亦然)?具体来说,是否有一个相对于另一个的性能优势?


1
我没有在任何答案中看到提到一个子查询COALESCE 被两次评估。
马丁·史密斯

4
“ ISNULL似乎更容易阅读,因为它看起来更清楚正在做什么” –真的吗?我发现名称不符合直觉:我希望它返回一个布尔值,该布尔值指示表达式解析为null还是未知值。该名称COALESCE仅是不直观的;)
某一天

Answers:



40
  • ISNULL是特定于Sybase / SQL Server的
  • COALESCE是便携式的

然后

  • ISNULL接受2个参数
  • COALESCE采用1-n参数

最后,还有一点乐趣。结果数据类型和长度/精度/小数位数

最后一点是为什么通常使用ISNULL的原因,因为它更容易预测(?),并且COALESCE可以添加意外的数据类型转换:这是“较慢”位的来源

DECLARE @len10 varchar(10); --leave it NULL
SELECT
    ISNULL(@len10, '0123456789ABCDEF'),     -- gives 0123456789
    COALESCE(@len10, '0123456789ABCDEF');   -- gives 0123456789ABCDEF

所有数据类型都相同,您将看不到任何实际差异...


22

正如Mark所指出的那样,您将很难找到性能差异。我认为其他因素将更为重要。对我而言,我始终使用COALESCE,而您或Mark都已经提到了其中的大多数:

  • COALESCE是ANSI标准。如果要移植我的代码,这是我不必担心的另一件事。对我个人而言,这并不重要,因为我知道此类端口实际上很少出现在Celko的课堂世界之外,但是对某些人来说,这是一个好处。
  • 与您所说的可读性相反,我发现阅读ISNULL 可能会更加困难,特别是对于来自其他语言或平台(其中ISNULL返回布尔值(SQL Server中不存在))的用户。当然,COALESCE很难拼写,但至少不会导致错误的假设。
  • 正如我可以说COALESCE(a,b,c,d)一样,COALESCE更加灵活,而使用ISNULL则必须做很多嵌套才能实现相同的目的。

您还应该确保,如果您将其与不同的数据类型/精度一起使用,则应该知道如何使用这两个函数来处理数据类型优先级。

注意

有一个例外。在当前版本的SQL Server中,这些处理方式有所不同:

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 

COALESCE变体实际上将执行some_aggregate_query两次(一次检查值,一次返回非零值),而ISNULL只会执行一次子查询。我在这里谈论其他一些差异:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.