【问题标题】:oracle Sql nvl or case which one is faster?oracle Sql nvl 或 case 哪个更快?
【发布时间】:2021-09-15 23:30:54
【问题描述】:

我想谈谈我们可以在 select 语句中使用 nvl 或 case 的场景。 在 PL-SQL 中使用 nvl 会更容易,这是真的。但是当涉及到查询时(在 select 语句中)

使用 nvl 会使其变慢吗?我有一个包含大量带有 NVl 的 select 语句的包。如果我用案例替换它们会更快吗?

例如;

select  case sum(nvl(birikim,0)) when null then 0 else sum(nvl(birikim,0) end  

而不是使用这个,

select nvl(sum(nvl(birikim, 0)), 0))

【问题讨论】:

  • nvl(sum(birikim), 0) 足够了,测试一下。
  • 优化内置函数调用是您需要担心的最后一步。您的查询速度是否足够快,可以看出差异?它是处理单个记录吗?出于测试目的,您可能会花一些时间准备适当的设置,包括冷启动、缓冲区刷新、多次运行等,并将完全没有功能的普通选择和相同的查询与例如 NVL 进行比较。我敢打赌,时间在统计上是微不足道的,主要受网络和磁盘 IO 的影响

标签: sql oracle case query-optimization nvl


【解决方案1】:

首先,您正在寻找微优化。 SQL 查询的开销通常在于数据移动,而不是对一行内的数据执行的特定操作(除非您使用大字符串或 blob 或用户定义的函数或类似的东西)。

其次,在SUM() 内部运行一个函数 会为每一行产生开销。也就是说,除非您在非常大的桌子上进行测量,否则您可能无法测量效果。

第三,您无需担心SUM() 中的NULL 值。所以你可以把你的逻辑写成:

select nvl(sum(birikim), 0)

虽然我更喜欢coalesce(),因为它是用于此目的的 SQL 标准函数:

select coalesce(sum(birikim), 0)

【讨论】:

    【解决方案2】:

    我怀疑您会看到性能大幅提升。内置功能非常优化。另一方面,您在SELECT 语句中使用的任何函数都会对性能产生影响,除非您的索引考虑了该函数。

    我的建议:对两个查询运行EXPLAIN PLAN 以检查性能。

    如果没有太大区别,请考虑可读性。使用NVL 而不是CASE 将使其更具可读性。有时您必须平衡性能和可维护性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多