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()将导致每一行的开销。也就是说,除非你在一张很大的桌子上测量,否则你可能无法测量效果。

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

select nvl(sum(birikim), 0)

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

select coalesce(sum(birikim), 0)

最新更新