COALESCE 与 ISNULL 的性能差异?

Ric*_*ard 57 sql-server syntax

我见过很多人使用 COALESCE 函数代替 ISNULL。从 Internet 搜索中,我发现 COALESCE 是 ANSI 标准,因此有一个优势,即我们知道使用它时会发生什么。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。

我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言中表现不同。

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

gbn*_*gbn 46

  • 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
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ith 32

COALESCE被内部翻译成一个CASE表达式,ISNULL是一个内部引擎函数。

COALESCE是ANSI标准函数,ISNULL是T-SQL。

Performance differences can and do arise when the choice influences the execution plan but the difference in the raw function speed is miniscule .


Aar*_*and 25

正如 Mark 指出的那样,您将很难找到性能差异;我认为其他因素会更重要。对我来说,我总是使用 COALESCE,你或马克已经提到了大部分:

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

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

笔记

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

SELECT COALESCE((SELECT some_aggregate_query),0); 

SELECT ISNULL((SELECT some_aggregate_query),0); 
Run Code Online (Sandbox Code Playgroud)

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