BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #7539同步于 2013/6/15
Database机器人发帖

请教个多表相同结构查询优化问题

Thinker
2013/6/15镜像同步0 回复
目前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') 然后把对应变量换成值 第二种方法是:逐天查询 我不是很熟悉数据库,请教一下高人看看该如何优化,可以提高查询的速度,谢谢
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。