有一个表,大概有8000万行记录,按照时间每月自动进行分区,现在要在该表中按照时间范围和某一字段的值进行数据查询,我们的SQL语句是这样写的
select STCD,TM,DRP,INTV,PDR,DYP,WTH FROM ST_PPTN_R WHERE STCD in ('81621600','81621610','81621660','81621665','81621650','81751645','81752675','81621720') AND (
TM between to_date('2014-11-21 08:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2014-11-30 23:59:59','YYYY-MM-DD HH24:MI:SS') or
TM between to_date('2014-12-01 00:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2014-12-31 23:59:59','YYYY-MM-DD HH24:MI:SS') or
...
TM between to_date('2015-10-01 00:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2015-10-31 23:59:59','YYYY-MM-DD HH24:MI:SS') or
TM between to_date('2015-11-01 00:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2015-11-26 08:00:00','YYYY-MM-DD HH24:MI:SS') ) AND DRP IS NOT NULL order by TM现在查询一次,大概花费44秒,求优化策略。
解决方案 »
- linux64位 下 C++ Oracle开发 编译错误
- 请教一段sql语句编写
- 为何基于template.fmb所建的form无法创建???
- 遇到一个棘手的问题,急求解决
- XP系统下装10G好用吗?
- 谁弄过informix 转到 oracle 10G ?还有现在一个Oracle 10G 标准版大概多少钱
- 关于oracle数据库中 varchar2的问题
- 昨天已经跳过楼了,今天还得去么?oracle连接问题,请大家赐教!
- 怎样知道某一天后三个月是几号?
- 请教各位大神一个统计的sql语句,感谢
- oracle存储过程,test(测试)时传自定义类型参数问题
- sql语句一直在执行,求大神告知其原因。万分感谢!!!
2、分区键是哪个字段?
3、stcd列的选择性如何?
4、表里总共有多少个月的数据?
分区字段是TM,按时间每个月一个分区;
STCD其实就是一个测站的站号,这个站基本一小时要回传一次数据,因此数据量较大
表里有3年的数据
试着在列(TM,STCD)或(STCD)上建立local索引。
create index idx_tm_stcd on ST_PPTN_R(tm,stcd) local;
create index idx_stcd on ST_PPTN_R(stcd) local;
依次建立以上索引,分别测试建每个索引的效果。
调整为local index后,效率有较大的增长,目前大概8-9秒,还有没有优化空间?
服务器配置还可以,我也觉得速度稍慢。
另外,你也可以把索引建在STCD上试试。上面的贴里有建索引的语句。
oracle 分区表