AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 4274
Accepted
Richard
Richard
Asked: 2011-08-04 06:10:18 +0800 CST2011-08-04 06:10:18 +0800 CST 2011-08-04 06:10:18 +0800 CST

COALESCE 与 ISNULL 的性能差异?

  • 772

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

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

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

sql-server syntax
  • 3 3 个回答
  • 51676 Views

3 个回答

  • Voted
  1. gbn
    2011-08-04T07:25:40+08:002011-08-04T07:25:40+08:00
    • ISNULL 特定于 Sybase/SQL Server
    • COALESCE 是便携式的

    然后

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

    最后,还有有趣的一点。结果数据类型和长度/精度/比例

    • ISNULL 与第一个参数相同
    • 根据数据类型优先级,COALESCE 是最高的

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

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

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

    • 47
  2. Best Answer
    Mark Storey-Smith
    2011-08-04T06:27:16+08:002011-08-04T06:27:16+08:00

    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 .

    • 34
  3. Aaron Bertrand
    2011-08-04T06:45:34+08:002011-08-04T06:45:34+08:00

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

    • 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); 
    

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

    • 在 SQL Server 中决定 COALESCE 和 ISNULL
    • 25

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve