Oracle SQL 中的 NOT Equal(<>) 忽略索引和 NULL 值行

NOT Equal(<>) in Oracle SQL is ignoring Index and NULL valued rows

提问人:atanu2destiny 提问时间:5/11/2023 最后编辑:jarlhatanu2destiny 更新时间:5/11/2023 访问量:352

问:

我有一个查询,需要根据 Oracle SQL 中的 NOT Equal 值进行过滤。不能将 EQUAL to 条件用作 unknown 中列的可能值。

查询:

SELECT * from employee where name <> 'John';

上面的查询忽略了名称列中的索引,并且不返回名称列中具有 null 的行。

解决方案:尝试进行 NULL 安全返回。

SELECT * from employee where name is null OR name <> 'John';

SELECT * from employee where nvl(name, 'NOT John') <> 'John';

上面两个查询能够过滤掉空行。 但不能使用 name 列中定义的索引。

请指教。

SQL Oracle 索引 sql-execution-plan sqlperformance

评论

5赞 Littlefoot 5/11/2023
如果优化程序认为全表扫描比使用索引更优化,它就会这样做。为什么你认为必须使用这个索引?您的“工作”是创建索引(如果适用)并定期收集统计数据;剩下的事情由甲骨文完成,在绝大多数情况下,它都会做对。
0赞 atanu2destiny 5/11/2023
是的,对。但是,如果解释简单说明它正在使用定义的索引,那就更好了。在这种情况下,我们知道使用它不会进行全表扫描,将使用 B+ 树进行查询
4赞 gsalem 5/11/2023
如果优化器认为使用索引更好,它就会这样做,并在执行计划中告诉。如果它确实决定进行全表扫描,它会告诉您。正如其他人所说,为什么您认为使用指数更好?
4赞 astentx 5/11/2023
一般来说,不相等意味着整个宇宙中除这个宇宙之外的一切,特别是假设列的语义。Index 不是 fast=true 开关,它不会仅仅因为它被命名为 index 而加快查询速度。您可以在数据库概念中阅读有关访问路径和物理存储的信息,其中简要介绍了访问策略,并提供了指向 SQL 优化指南的链接。name

答:

2赞 Wernfried Domscheit 5/11/2023 #1

索引的目的是快速找到特定值。“不相等”的条件通常不会通过指数获得收益。 值未编制索引,因此也没有好处。NULL

如果您使用 ,则看起来会有所不同,那里将使用索引。但是,BITMAP 索引还有其他限制,它是否有用取决于您的应用程序和数据。BITMAP INDEX

评论

0赞 atanu2destiny 5/11/2023
右。是否有任何替代语法或提示可用于实现与使用定义的索引相同的不相等功能
2赞 Wernfried Domscheit 5/11/2023
正如 @Littlefoot 在评论中所说,为什么您认为使用索引时查询运行得更快?在某些情况下,FULL TABLE SCAN 比索引扫描更快 - 您的查询就是这种情况的典型示例。