oracle表没有索引,数据库 – 为什么oracle表被索引但仍然进行全表扫描?

如果不了解方式而不了解您的数据模型和业务,就很难给出具体的积极建议.但是这里有一些关于你的索引策略的注释以及为什么我猜测优化器没有使用你拥有的indx.

在子查询中,REDLINE_MSATTRIBUTE的访问路径来自三列:

> CLASS

> OBJECT_ID

> CHANGE_RELEASE_DATE.

CLASS未编入索引.但这可能不是很有选择性. OBJECT_ID

是复合索引的前导列,但其他列与子查询无关.

但最大的问题是CHANGE_RELEASE_DATE.这根本没有索引.这是个坏消息,因为您的一个主键查找会生成一个日期,然后与CHANGE_RELEASE_DATE进行比较.如果列未编入索引,则数据库必须读取表以获取其值.

主查询开始了

> ATTID

> CHANGE_ID

> OBJECT_ID(再次)

> CHANGE_RELEASE_DATE(再次)

> CLASS(再次)

> OLD_VALUE

ATTID已被编入索引,但该索引有多顺畅?优化器可能不认为它是非常有选择性的. ATTID也在一个带有CHANGE_ID和OLD_VALUE的复合索引中,但它们都不是前导列,所以这不是很有用.我们已经讨论了CLASS,CHANGE_RELEASE_DATE和OBJECT_ID.

优化器只会选择使用索引,如果它比表扫描更便宜(读取更少).这通常意味着WHERE子句标准需要映射到索引的前导(即最左边)列.这可能是子查询中OBJECT_ID和ATTID的情况,除了

>执行计划必须执行INDEX SKIP SCAN,因为REDLINE_MSATTRIBUTE_INDEX1在两列之间具有CHANGE_ID

>无论如何,数据库必须转到表中才能获得CLASS和CHANGE_RELEASE_DATE.

因此,您可以通过在(CHANGE_RELEASE_DATE,CLASS,OBJECT_ID,ATTID)上构建索引来获得一些改进.但正如我前面所说,在不了解你的情况的情况下,这些只是消息灵通的猜测.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值