是否可以通过固定执行计划 强制查询不通过索引
是不是可以通过固定执行计划 强制查询不通过索引
如题,
我通过一些文档上给的步骤 希望能够让查询不走索引
但是没有成功
最后还是 index range
1)grant CREATE ANY OUTLINE to scott; (sys)
2)exec DBMS_OUTLN_EDIT.CREATE_EDIT_TABLES;(scott)
3)alter session set CREATE_STORED_OUTLINES =aaa ;
4)alter session set USE_STORED_OUTLINES=aaa;
5)create or replace OUTLINE test3_ename FOR CATEGORY aaa ON
select * from test3 where ename='SMITH';
6)select * from test3 where ename='SMITH';(注意此时ename列没有索引)
7)create index test3_ename on test3(ENAME);
8)select * from test3 where ename='SMITH';(注意此时ename列有索引,但是执行计划仍然没有使用索引)
------解决方案--------------------
因为oracle觉得走全表扫描比走索引更快,所以不走索引。
------解决方案--------------------
不走索引大体有以下几个原因:
你在Instance级别所用的是all_rows的方式
你的表的统计信息(最可能的原因)
你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。
解决方法:
可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。
------解决方案--------------------
hint 没写对。。。
------解决方案--------------------
如题,
我通过一些文档上给的步骤 希望能够让查询不走索引
但是没有成功
最后还是 index range
1)grant CREATE ANY OUTLINE to scott; (sys)
2)exec DBMS_OUTLN_EDIT.CREATE_EDIT_TABLES;(scott)
3)alter session set CREATE_STORED_OUTLINES =aaa ;
4)alter session set USE_STORED_OUTLINES=aaa;
5)create or replace OUTLINE test3_ename FOR CATEGORY aaa ON
select * from test3 where ename='SMITH';
6)select * from test3 where ename='SMITH';(注意此时ename列没有索引)
7)create index test3_ename on test3(ENAME);
8)select * from test3 where ename='SMITH';(注意此时ename列有索引,但是执行计划仍然没有使用索引)
------解决方案--------------------
因为oracle觉得走全表扫描比走索引更快,所以不走索引。
------解决方案--------------------
不走索引大体有以下几个原因:
你在Instance级别所用的是all_rows的方式
你的表的统计信息(最可能的原因)
你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。
解决方法:
可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。
------解决方案--------------------
hint 没写对。。。
------解决方案--------------------