返回信息流目前Oracle 11g数据库中的数据组织形式是这样的:
数据按照时间每5分钟的数据存储在一张表中;
每天有288张表;
数据库有按天的视图,如V_DATA_20130615就是2013年6月15日这一天所有数据构成的视图;
按天的视图,视图结构都是一样的,每天的数据量大约在2000万条左右;
现在需要查询一段时间内的符合某种条件的数据结果,查询语句如下:
select ID, MSGTYPE, SRCADDR, DESTADDR, STARTTIME, ENDTIME, MSGSTATUS from :queryTable where SRCADDR = '10.0.0.0' AND DESTADDR = :destAddr AND ENDTIME >= to_date(:startDatetime,'yyyy-mm-dd hh24:mi:ss') AND ENDTIME <= to_date(:endDatetime,'yyyy-mm-dd hh24:mi:ss')
这条语句就是在表queryTable中查询从startDatetime到endDatetime时间范围内DESTADDR为
destaddr并且SRCADDR为10.0.0.0的数据条目;这里面冒号开头的都是变量。
因查询多天的数据,queryTable就是不同天的视图的,且查询哪些天是变化的,所以需要从多个相同结构的天视图中查询数据,目前试了两种方法,速度都比较慢,比如7天的数据,有的达到60秒以上才给出结果
第一种方法是:根据要查询的天的范围,动态拼出来sql,用union all组合起来一次性查询;即如果查询6月13日到6月15日的数据,sql就写成了
select ID, MSGTYPE, SRCADDR, DESTADDR, STARTTIME, ENDTIME, MSGSTATUS from V_DATA_20130613 where SRCADDR = '10.0.0.0' AND DESTADDR = :destAddr AND ENDTIME >= to_date(:startDatetime,'yyyy-mm-dd hh24:mi:ss') AND ENDTIME <= to_date(:endDatetime,'yyyy-mm-dd hh24:mi:ss') union all select ID, MSGTYPE, SRCADDR, DESTADDR, STARTTIME, ENDTIME, MSGSTATUS from V_DATA_20130614 where SRCADDR = '10.0.0.0' AND DESTADDR = :destAddr AND ENDTIME >= to_date(:startDatetime,'yyyy-mm-dd hh24:mi:ss') AND ENDTIME <= to_date(:endDatetime,'yyyy-mm-dd hh24:mi:ss') union all select ID, MSGTYPE, SRCADDR, DESTADDR, STARTTIME, ENDTIME, MSGSTATUS from V_DATA_20130615 where SRCADDR = '10.0.0.0' AND DESTADDR = :destAddr AND ENDTIME >= to_date(:startDatetime,'yyyy-mm-dd hh24:mi:ss') AND ENDTIME <= to_date(:endDatetime,'yyyy-mm-dd hh24:mi:ss')
然后把对应变量换成值
第二种方法是:逐天查询
我不是很熟悉数据库,请教一下高人看看该如何优化,可以提高查询的速度,谢谢
这是一条镜像帖。来源:北邮人论坛 / database / #7539同步于 2013/6/15
Database机器人发帖
请教个多表相同结构查询优化问题
Thinker
2013/6/15镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。