是不是可以通过固定执行计划 强制查询不通过索引

时间:2021-11-16 04:32:28
如题,


我通过一些文档上给的步骤 希望能够让查询不走索引


但是没有成功
最后还是 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列有索引,但是执行计划仍然没有使用索引)



5 个解决方案

#1


因为oracle觉得走全表扫描比走索引更快,所以不走索引。

#2


不走索引大体有以下几个原因:

你在Instance级别所用的是all_rows的方式 
你的表的统计信息(最可能的原因) 
你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 
解决方法:

可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。

#3


引用 2 楼  的回复:
不走索引大体有以下几个原因:

你在Instance级别所用的是all_rows的方式 
你的表的统计信息(最可能的原因) 
你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 
解决方法:

可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。



其实不是这个意思啊

是我要强迫针对某一个表的查询, 一定用full scan

我就是想尝试一下 hint 的作用
 
两次情况,相反

一次 建立索引之后, 我设定的hint就被无视的, oracle 走了索引
另一次, 建立索引之后,按照hint 的规定, 他没选择索引

我就不知道两者区别在哪里??



#4


hint 没写对。。。

#5


引用 4 楼  的回复:
hint 没写对。。。


完全有可能

#1


因为oracle觉得走全表扫描比走索引更快,所以不走索引。

#2


不走索引大体有以下几个原因:

你在Instance级别所用的是all_rows的方式 
你的表的统计信息(最可能的原因) 
你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 
解决方法:

可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。

#3


引用 2 楼  的回复:
不走索引大体有以下几个原因:

你在Instance级别所用的是all_rows的方式 
你的表的统计信息(最可能的原因) 
你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。 
解决方法:

可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。



其实不是这个意思啊

是我要强迫针对某一个表的查询, 一定用full scan

我就是想尝试一下 hint 的作用
 
两次情况,相反

一次 建立索引之后, 我设定的hint就被无视的, oracle 走了索引
另一次, 建立索引之后,按照hint 的规定, 他没选择索引

我就不知道两者区别在哪里??



#4


hint 没写对。。。

#5


引用 4 楼  的回复:
hint 没写对。。。


完全有可能