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快。
探索不以困难而止,学习不以艰苦而终