oracle10g不走索引,not in 和 <> 不走索引

在Oracle 10g中,当在WHERE子句中使用不等于(<>)或NOT IN操作符时,数据库倾向于忽略索引。这是因为Oracle认为这些操作可能导致大量数据的检索,全表扫描可能更快。文章通过创建大表、插入数据、建立索引并进行10053 trace分析,证实了这一行为。虽然可以通过调整SQL语句(如使用OR操作符)来利用索引,但默认情况下,Oracle在处理这些情况时会选择全表扫描。
摘要由CSDN通过智能技术生成

首先我们要知道的一点就是CBO的代码oracle是不会对我们公开的,起码现在是。所以本文中的结论不一定适用所有的版本。在应用本文的结论之前最好先试一下。

ok 下面就是本文的结论,当你在where语句中使用不等于或者not in时候,oracle 倾向于忽略索引。 比如:

69c5a8ac3fa60e0848d784a6dd461da6.pngSQL> Select * from test where text<>‘star‘;

IDTEXT

---------- ------------

4939426 sun

69c5a8ac3fa60e0848d784a6dd461da6.png

这条语句即使在test上有索引,oracle也仍然会忽略。

接下来我们分析证明一下这是为什么。 其实,我认为oracle这么做是有道理的。一般我们在写SQL的时候,如果用了

<>,也就是不等于,通常都是说选取结果集中的很大一部分。我们可以感受一下平时我们的思维方式和和习惯确实是这样的。比如我们说要"找出这些人中不是姓李的","找出这些车中不是大众的"。这一般来说是要返回结果集中很大一部分的。Oracle认为如果是这样,那么用索引不如全表扫描迅速,所以这种情况根本就不考虑索引,直接采用全表扫描。

而且oracle认为,如果你知道你的<>会返回少量的结果,那么你应该会调整你的SQL 用 (< or >)来代替。

下面我们验证一下。

首先创建表。一个很大的表。

69c5a8ac3fa60e0848d784a6dd461da6.pngSQL> select * fromv$version;

BANNER--------------------------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 -64bi

PL/SQL Release 10.2.0.5.0 -Production

CORE10.2.0.5.0Production

TNSfor Solaris: Version 10.2.0.5.0 -Production

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值