我想谈谈一个场景,我们可以在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()
将导致每一行的开销。也就是说,除非你在一张很大的桌子上测量,否则你可能无法测量效果。
第三,您不需要担心SUM()
中的NULL
值。所以你可以把你的逻辑写成:
select nvl(sum(birikim), 0)
尽管我更喜欢coalesce()
,因为它是用于此目的的SQL标准函数:
select coalesce(sum(birikim), 0)