oracle Sql nvl 或 case 哪个更快?

问题描述

我想讲一个场景,我们可以在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))

解决方法

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

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

如果差别不大,请考虑可读性。使用 NVL 而不是 CASE 会使其更具可读性。有时您必须在性能和可维护性之间取得平衡。

,

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

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

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

select nvl(sum(birikim),0)

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

select coalesce(sum(birikim),0)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...