同一条SQL语句,相同的WHERE条件,只是条件里面的值不同,为什么有的走索引,有的不走?

nightgoblin 2020-06-24 03:30:31
数据库版本oracle11g 11.2.0.4.0
看下面的SQL语句的执行计划,引用了索引,如下图:

把时间条件里面的值修改到“2020-06-15 00:00:00”,就不走索引了,如下图:

不知道为什么,请各位高手帮忙解答下??
不同值的数据量如下:
16号到19号的是437691

15号到19号的是573580

整个表的数据量是:13374740
数据库是采用CBO的查询优化器:

...全文
2082 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightgoblin 2020-07-01
  • 打赏
  • 举报
回复
引用 7 楼 lhdz_bj 的回复:
[quote=引用 6 楼 nightgoblin 的回复:] [quote=引用 4 楼 lhdz_bj 的回复:] 其实这种现象很常见,很比较合理,当条件值改变时,可能会导致执行计划的改变,因为,目前关系库的高版本都是CBO的优化器,当获取的行数较多时,可能会走FTS。 另外,楼主的这张表里,总共有多少条数据呢?
整张表大概1400多万条数据,但走索引 和不走索引 速度 差距好大,走索引只要0.2秒,不走索引需要15秒。 真不知道优化器是怎么选择的,为啥不走索引。。[/quote] 1、0.2s,估计是返回第一条结果的反应时间,读完几十万条估计要比这个时间长; 2、这个和你的优化器模式相关,因为你当前的CBO模式为all_rows,你可以用hints试试: select /*+ first_rows */ ... from ... where ...; 或 select /*+ choose */ ... from ... where ...; 看看执行计划是否有变化。[/quote] 感谢解答,试了下用/*+ first_rows */ 就会走索引,查询速度很快。CBO基于成本来选择用全表扫描比走索引耗费资源小些。
lhdz_bj 2020-06-28
  • 打赏
  • 举报
回复
另外,可以把两个字段的顺序调整下建个索引试试。
lhdz_bj 2020-06-28
  • 打赏
  • 举报
回复
其实这种现象很常见,很比较合理,当条件值改变时,可能会导致执行计划的改变,因为,目前关系库的高版本都是CBO的优化器,当获取的行数较多时,可能会走FTS。
另外,楼主的这张表里,总共有多少条数据呢?
sxq129601 2020-06-28
  • 打赏
  • 举报
回复
了解下统计信息和直方图,数据分布不均匀可能会导致这种情况,统计信息查看exec dbms_stats.gather_table_stats
nightgoblin 2020-06-28
  • 打赏
  • 举报
回复
引用 1 楼 卖水果的net 的回复:
1、说一下索引情况。 2、更新一下统计信息。
T_IMES_PRODUCT_RE_FINISH是在WID_CODE, OPER_TIME这个两个字段建立的索引。 怎么更新统计信息??
lhdz_bj 2020-06-28
  • 打赏
  • 举报
回复
引用 6 楼 nightgoblin 的回复:
[quote=引用 4 楼 lhdz_bj 的回复:]
其实这种现象很常见,很比较合理,当条件值改变时,可能会导致执行计划的改变,因为,目前关系库的高版本都是CBO的优化器,当获取的行数较多时,可能会走FTS。
另外,楼主的这张表里,总共有多少条数据呢?

整张表大概1400多万条数据,但走索引 和不走索引 速度 差距好大,走索引只要0.2秒,不走索引需要15秒。
真不知道优化器是怎么选择的,为啥不走索引。。[/quote]

1、0.2s,估计是返回第一条结果的反应时间,读完几十万条估计要比这个时间长;
2、这个和你的优化器模式相关,因为你当前的CBO模式为all_rows,你可以用hints试试:
select /*+ first_rows */ ... from ... where ...;

select /*+ choose */ ... from ... where ...;
看看执行计划是否有变化。
nightgoblin 2020-06-28
  • 打赏
  • 举报
回复
引用 4 楼 lhdz_bj 的回复:
其实这种现象很常见,很比较合理,当条件值改变时,可能会导致执行计划的改变,因为,目前关系库的高版本都是CBO的优化器,当获取的行数较多时,可能会走FTS。 另外,楼主的这张表里,总共有多少条数据呢?
整张表大概1400多万条数据,但走索引 和不走索引 速度 差距好大,走索引只要0.2秒,不走索引需要15秒。 真不知道优化器是怎么选择的,为啥不走索引。。
卖水果的net 2020-06-24
  • 打赏
  • 举报
回复
1、说一下索引情况。 2、更新一下统计信息。

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧