我反复看到类似的查询:
select count(*)
from some_table
where nvl(some_column,'N') = 'Y';
some_column
在('Y', 'N', null)
中取值。
是否有理由使用它而不是以下内容?
select count(*)
from some_table
where some_column = 'Y';
在我尝试过的几个示例中,似乎没有任何性能优势,并且在某些情况下,第一个查询的速度较慢。
谢谢。
答案 0 :(得分:0)
我也经常看到这一点。开发人员很可能已经习惯在nvl
表达式中包装可为空的列,这可能是在过去被意外的null值烧掉之后,现在将其添加到任何地方而无需费心思考,或者可能没有首先真正了解了这个问题。
这将防止在基础列上使用任何索引,分区修剪或直方图(尽管优化器的自适应功能可能会生成动态直方图来对此进行校正)。
例如,如果您想将null视为不是“ Y”,则在检查表达式不具有某些特定值的情况下,可能需要这种构造。也许开发人员正在考虑这一点。