执行计划中未使用索引! 受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有可能认为全表扫描比索引更快从而不用索引