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=1ID 为 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 ... 或的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 12c 中创建带条件的索引?

12c带你了解Oracle 12c数据库扩展的统计信息(Extended Statistics)的搜集

12c带你了解Oracle 12c数据库扩展的统计信息(Extended Statistics)的搜集

oracle weblogic 11g和 12c的区别

关于 Oracle 12c 中的用户

从 oracle 12c 升级到 oracle 19c 导致查询性能下降