如果不了解方式而不了解您的数据模型和业务,就很难给出具体的积极建议.但是这里有一些关于你的索引策略的注释以及为什么我猜测优化器没有使用你拥有的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)上构建索引来获得一些改进.但正如我前面所说,在不了解你的情况的情况下,这些只是消息灵通的猜测.