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