Oracle 12c:WHERE NOT 与 WHERE ... 或
Posted
技术标签:
【中文标题】Oracle 12c:WHERE NOT 与 WHERE ... 或【英文标题】:Oracle 12c: WHERE NOT vs WHERE ... OR 【发布时间】:2020-07-08 14:42:57 【问题描述】:我需要选择 RN=1 或 ID 为 NULL 的行。 哪种情况更高效、更快?
WHERE id IS NULL OR RN=1
对
WHERE NOT (id IS NOT NULL AND RN >1)
【问题讨论】:
首先,RN >1
不是 RN=1
的反义词。如果您将RN >1
更改为RN<>1
,则相反。话虽如此,在此修复之后,两者是等效的,并且应该产生完全相同的执行计划。
第一个正确,第二个错误。
虽然它们做不同的事情,但 Oracle 有一个复杂的优化器,我希望它们具有非常相似的性能特征。
【参考方案1】:
更好的方法是第一种方法,因为第二种方法将返回所有记录,即使 ID
不为空。
第二种方法如何为您提供所有记录?
WHERE NOT
(id IS NOT NULL
AND RN >1) -- this condition will be always false as you can not use > condition alone on rownum
So <some_condition> AND False --> False
NOT (FALSE) --> True
所以,你应该使用第一个条件:WHERE id IS NULL OR RN=1
【讨论】:
以上是关于Oracle 12c:WHERE NOT 与 WHERE ... 或的主要内容,如果未能解决你的问题,请参考以下文章
12c带你了解Oracle 12c数据库扩展的统计信息(Extended Statistics)的搜集