原来执行的语句是走索引的,在什么情况下会变得不走索引

问题细节,今天早上突然数据查询很慢,进过查询问题锁定,发现是之前执行索引的语句现在不执行索引了,经过测试锁定在这个表的一个字段上,单独运行这个字段进行查询时还是执行索引的如下图

QQ截图20160113115033.jpg



但是添加其他条件后就不执行索引而是进行全表查询


表中索引建立情况为:


我添加过一次表空间:


在线等答案,求大神们帮组

参与17

6同行回答

星陨无痕星陨无痕技术经理北京世纪东方国际旅行社
该问题的原因是因为数据库运行时间长了后表中的聚簇印子过大,导致Oracle优化器认为如果使用索引进行查询比进行全表查询还要消耗效率,所以直接使用全表查询而不是使用索引;后续我处理的办法是对使用索引字段的条件添加更细致的判定,使其减少资源消耗,当其资源消耗率降低后自然...显示全部
该问题的原因是因为数据库运行时间长了后表中的聚簇印子过大,导致Oracle优化器认为如果使用索引进行查询比进行全表查询还要消耗效率,所以直接使用全表查询而不是使用索引;

后续我处理的办法是对使用索引字段的条件添加更细致的判定,使其减少资源消耗,当其资源消耗率降低后自然就运行索引了。

收起
旅游 · 2016-01-25
浏览1379
Scott_jinScott_jin数据库管理员环境
我的理解是,优化器认为第二个查询全表扫描的成本更低。 第一个查询走索引是因为你的结果集中其实只有be.starttime的字段, 当这个字段上有一个单独的索引时,肯定直接完全走此索引得到结果集即可。 第二个查询当你加上backdata时,优化器发现假如走starttime的索引后仍然需要根...显示全部

我的理解是,优化器认为第二个查询全表扫描的成本更低。

第一个查询走索引是因为你的结果集中其实只有be.starttime的字段, 当这个字段上有一个单独的索引时,肯定直接完全走此索引得到结果集即可。

第二个查询当你加上backdata时,优化器发现假如走starttime的索引后仍然需要根据rid串回data进行查询, 它认为这样的成本更高。

所以出现了加where条件不走索引的情况。 其实是和你的结果集有关系。

收起
互联网服务 · 2016-01-25
浏览1281
wolfopwolfop其它Why should I tell you?
统计信息显示全部

统计信息

收起
IT其它 · 2016-01-13
浏览1237
bg1641321861bg1641321861数据库开发工程师没有
中间不是修改过查询条件么?显示全部

中间不是修改过查询条件么?

收起
IT咨询服务 · 2016-03-23
浏览1214
大力水手大力水手售前技术支持北京南天软件股份有限公司
貌似统计更新一把显示全部

貌似统计更新一把

收起
系统集成 · 2016-03-22
浏览1230
星陨无痕星陨无痕技术经理北京世纪东方国际旅行社
问题已经解决。显示全部

问题已经解决。

收起
旅游 · 2016-01-13
浏览1314

提问者

星陨无痕
技术经理北京世纪东方国际旅行社

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2016-01-13
  • 关注会员:7 人
  • 问题浏览:4734
  • 最近回答:2016-03-23
  • X社区推广