背景:最近在优化某些SQL,数据量也不是很大,就几百万笔数据,但是发现针对某个时间,下了条件后,查询的数据非常慢,而且不是慢的一点点,看了下COST值,居然是全表扫描,但是针对时间栏位我明明已经做了索引,但是就是不起作用。
我们知道,针对大数据量的表,如果条件中需要根据某些字段来作为查询条件查找数据,我们通常会对那些字段建立索引,通常,如果数据量大的话,oracle会以自己优化的方式,通过我们建立的索引来查找数据,这样会使查询速度变快很多。
但是如果某些条件是经过处理的,即使用了函数,那么索引将立即失效,比如说“select * from tableName where substr(cloumnName,3,1)= ‘test’ ”,此时,如果为cloumnName设立了索引,那么实际上,如果使用切割字符串后的结果作为条件,那么oracle永远都不会使用这个索引的。
看下面的例子:
可恨的德国佬在建表的时候,非要把简单的年月日时分秒记成2个栏位bearb_date和bearb_time两个栏位,前一个字段是年月日,即yyyy/mm/dd的date类型,后一个字段是那天的时间距离那天0点的秒数,是number类型,说白了也就是那天的时分秒。
所以当在以时间范围查询的时候,必须做一个转换,并且oracle还没有现成的转换函数,只能自己写一个函数,即下面的get_datetime(date,time)函数。
1.为此表的这2个字段建立索引