优化查询的简单方法是为where子句中存在的字段加索引,但考虑如下情况:
我有一张表,有一个日期记录代表每行插入时的日期加时间,当表里有上百万条记录时,查询某个时间段
的记录时,会很慢.
表结构:id content mydate
1 'test' 2005-9-30 12:00:00
2 'test2' 2005-9-30 12:00:01查询语句如下:select * from t_mytable where mydate>=v_datefrom and mydate<v_dateto;v_datefrom和v_dateto是时间段的开始和结束时间点.这样的查询语句如何优化?因为表里有上百万条的记录,而查询时使用的是>=和<这种比较,所以为mydate加了索引也必须导致全表遍历啊.如何解决啊?这种查询应该是经常遇到的查询啊.望大哥大姐给个答复.
我有一张表,有一个日期记录代表每行插入时的日期加时间,当表里有上百万条记录时,查询某个时间段
的记录时,会很慢.
表结构:id content mydate
1 'test' 2005-9-30 12:00:00
2 'test2' 2005-9-30 12:00:01查询语句如下:select * from t_mytable where mydate>=v_datefrom and mydate<v_dateto;v_datefrom和v_dateto是时间段的开始和结束时间点.这样的查询语句如何优化?因为表里有上百万条的记录,而查询时使用的是>=和<这种比较,所以为mydate加了索引也必须导致全表遍历啊.如何解决啊?这种查询应该是经常遇到的查询啊.望大哥大姐给个答复.
select * from tb_name
where substr(to_date(mydate,'yyyymmdd'))='200509';
查询9月份的全部数据
select * from tb_name
where substr(to_char(mydate,'yyyymmdd'))='200509';
select * from tb_name
where substr(to_char(mydate,'yyyymmdd'),1,6)='200509';
select * from t_mytable where mydate>=v_datefrom and mydate<v_dateto;
是应该能用上索引的。除非oracle认为读取的记录与表总记录数相比比较多,才会采用表扫描。这是如果实际返回的记录数不多,可以考虑对表做分析。
1.因为索引是一些hash值而已,因而只能适用于=和like这种场合,而这个sql语句使用的是>=和<,所以此时索引并不起作用.
2.由于每条记录的date字段的值都是不一样的,所以加了索引以后,索引占用的内存很大,超出了PGA中内存值的设置,导致如下结果:即使索引可以用,也要用到内存磁盘交换,导致变慢.我说的这两条有没有道理啊?给解个惑吧...