暂无图片
请问,我在某张表上建了一个索引,可是执行计划并没有走这个索引,这是为什么?
我来答
分享
1℃
2020-03-07
请问,我在某张表上建了一个索引,可是执行计划并没有走这个索引,这是为什么?
暂无图片 5M

15835944061.jpg

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
王小那个鑫

执行计划是否选择走索引是和数据表的统计信息、数据分布、条件列的选择率有关。CBO会从可能的执行计划中选择出cost最低的执行计划来执行SQL。所以,您的这个情况可能是:
1.统计信息不准确;
2.条件分布不均匀,条件列的可选择度低(比如,满足的这个条件为数据中的大部分);
此时,CBO认为走全表扫描的成本要比走索引更小,效率会更高,此时就会选择走全表。

您可以通过加index的hint强制走该索引,然后看看cost值和走全表的cost那个小,就会比较明朗了。

如果想更深入的了解原因,也可以通过10053事件来对这个SQL进行分析。

暂无图片 评论
暂无图片 有用 0
打赏 0
外包DBA

这个是解释计划,用display cursor看下,里面有访问路径,发出来看下,有可能是发生隐士类型转换了

暂无图片 评论
暂无图片 有用 0
打赏 0
刘峰

最直观的计算方法,查一下where后面的两个过滤条件返回的结果集N1,主表的结果集为N2,如果N1/N2的值较大(例如超过10%,CBO认为走索引+回表的代价大于走全表扫描),此时执行计划就不会走索引

暂无图片 评论
暂无图片 有用 0
打赏 0
田弼元

可能是发生了转换没法走,也可能是统计信息或数据分布导致CBP认为不该走,又或者不走索引反而更快。建议先看看执行计划,然后加hint提示走索引,再看看执行计划

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
非归档情况下如何强制online,被offline的数据文件
回答 1
应该没有强制online,你可以先recover一下,然后online试试能不能online上。如果online不上来,那应该只能通过bbed修改被下线数据文件的scn号的方式来上线数据文件了。
Oracle的位图索引与B*Tree索引有什么不同?
回答 5
已采纳
位图索引的结构与BTree索引不同。它的一个索引键条目会指向多行数据,而在BTree索引中,索引键和表中的行存在一对一的关系;位图索引特别不适用OLTP系统,而BTree适用OLTP。
emcc误报问题
回答 3
好的,谢谢盖总
oracle创建内存表,内存表的数据是永久保存的吗?
回答 3
已采纳
keepcache那种是内存的。如果是临时表也是内存的。不会会话结束就没有了inmemory的内存的重启还在
有promethus做好的oracle监控模板可以给参考吗?
回答 1
已采纳
模板官方应该有吧。至少zabbix就有,而且随着版本升级,模板功能也在增加。不管是promethus还是zabbix这种KV类型的监控模板都是最基础的。有些其实不见得好用,即使你知道了这个时间段CPU
oracle10.2.0.4有cpu数量限制吗?
回答 1
在StandardEditionOne(SE1)版本中,Oracle10.2.0.4限制了最大可用的CPU数量为一个物理CPU或者一个CPU套装(Socket)。在StandardEdition(SE
oracle 中dual的作用。
回答 3
已采纳
Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'。例如:执行selectfromdual,里面只有一条记录;执行insertintodualvalues('Y'
Oracle服务器端sqlplus在表里插入中文,sqlplus里能正常显示,客户端plsql显示乱码。客户端plsql插入中文,plsql里能正常显示,服务端sqlplus乱码
回答 1
已采纳
你用sqlplus插入中文的时候,是用的手敲命令还是用的sql文件?有没有检查一下sql文件的编码是utf8还是gbk?
oracle10.2.0.4有没有cpu数量限制?
回答 1
没有。
oracle
回答 3
已采纳
在Oracle中,下列语句会因为名称非法而失败:B.createtableupdate(col1date);E.createtable1number(col1date);Oracle对表和列的命名有一