Oracle中建立时间字段索引后衍生出来的问题

       默认的大家可能都认为字段上加了函数,索引都会失效,然而也有特殊情况。

       我就讲讲我遇到的问题吧,希望有大佬后续讲其中的奥秘。

       我在时间字段created_time上创建了普通索引,然后做百万级表关联查询的时间,加上时间区间去查看某一个时间段的数据并根据时间降序排序。Oracle库中时间字段created_time定义的类型为Date类型,我在用条件created_time between to_date('2020-07-01','yyyy-MM-dd') and to_date('2020-08-01','yyyy-MM-dd')查询时,看了执行计划,然而并没有走索引,而且查询时间用了3s多,初步排查下来是因为查询区间的数据量过大导致不走索引,然后我缩小时间区间,确实走索引了,查看执行计划索引的扫描策略为RANGE SCAN,但是感觉并没有快多少。

       紧着我改了下查询语句,使用了函数对created_time字段处理,如to_char(created_time,'yyyy-MM-dd') between '2020-07-01' and '2020-08-01',查看执行计划也使用到索引了,索引的扫描策略为FULL SCAN DESCENDING然后再看下执行时间,直接变成0.05s,简直不可思议。

       目前排查下来我的总结就是:Oracle中如果索引扫描策略为FULL SCAN DESCENDING的查询语句比索引扫描策略为RANGE SCAN快。

posted @ 2020-10-22 17:45  今夕是何年?  阅读(3228)  评论(0编辑  收藏  举报