日期:2014-05-16  浏览次数:20986 次

执行计划中未使用索引! 受min函数影响?
我的sql语句如下:
SELECT ATTID, VALUE FROM REDLINE_MSATTRIBUTE 
WHERE(ATTID, CHANGE_RELEASE_DATE) 
IN (SELECT ATTID, MIN(CHANGE_RELEASE_DATE) FROM REDLINE_MSATTRIBUTE WHERE CLASS = 9000 AND OBJECT_ID = 32718015 
AND CHANGE_RELEASE_DATE >  (SELECT RELEASE_DATE FROM CHANGE WHERE ID = 50839166) 
AND ATTID IN (...此处省略...) GROUP BY ATTID)
AND CLASS = 9000 AND OBJECT_ID = 32718015 AND OLD_VALUE='Y' ORDER BY ATTID, VALUE;

给表建了如下的索引:
 CREATE INDEX REDLINE_MSATTRIBUTE_AINDEX ON REDLINE_MSATTRIBUTE
  (
    "ATTID",
    "CHANGE_RELEASE_DATE",
    "CLASS",
    "OBJECT_ID",
    "OLD_VALUE"
  );
但是在执行sql语句的时候,执行计划中并没有使用此索引,有些资料中提到如果索引字段中使用了函数,那么索引不会被使用。那么是不是sql语句中的MIN(CHANGE_RELEASE_DATE)导致改索引不被使用呢?

有没有什么办法保证改索引会被使用,或者有什么是发方法替代min函数?

------解决方案--------------------
加索引前请重构语句,redline_msattribute这张表一次扫描就可以得出结果了,你的写法多扫描了一次。
------解决方案--------------------
没用索引的原因,不确定,因为不是很了解你的数据环境。
另外,min函数的使用,不影响索引的使用。
如果需要详细讨论,可以和我联系。
希望二楼的朋友能说下,如何重构?如何一次扫描能完成?
------解决方案--------------------
如果表不是太大的话Oracle有可能认为全表扫描比索引更快从而不用索引