求高效Sql查询-oracle
首先介绍下表结构
表先后进行过2次修整,不过目前都在不同的客户那是用
1)
CREATE TABLE NETWORK_FLOWTABLE
(
EQUIP_ID NUMBER(20) NOT NULL, /*外键 CMDB_CI.id*/
IFINDEX NUMBER(10), /*外键 NETWORK_INTERFACE.id*/
COLLECTDATE DATE, /*时间*/
RXUTIL NUMBER(20,4),
TXUTIL NUMBER(20,4),
RXBPS NUMBER(20,4),
TXBPS NUMBER(20,4),
CLEANID1 NUMBER(20),
CLEANID2 NUMBER(20),
CLEANID3 NUMBER(20),
PERIOD NUMBER(4) DEFAULT '0'
)
PARTITION BY HASH (EQUIP_ID) (
PARTITION p_1,
.....
)
2)
CREATE TABLE NETWORK_FLOWTABLE
(
EQUIP_ID NUMBER(20) NOT NULL, /*外键 CMDB_CI.id*/
IFINDEX NUMBER(10), /*外键 NETWORK_INTERFACE.id*/
COLLECTDATE DATE, /*时间*/
RXUTIL NUMBER(20,4),
TXUTIL NUMBER(20,4),
RXBPS NUMBER(20,4),
TXBPS NUMBER(20,4),
CLEANID1 NUMBER(20),
CLEANID2 NUMBER(20),
CLEANID3 NUMBER(20),
PERIOD NUMBER(4) DEFAULT '0'
)PARTITION BY RANGE (COLLECTDATE) subpartition by hash(EQUIP_ID)(
PARTITION VALUES LESS THAN (TO_DATE('2008-01-01','YYYY-MM-DD')),
....
);
查询数据要求
1、根据Equip_id,ifindex 进行分组,在一个时间域中 求个分组中RXBPS的最大值和TXBPS的最大值,
2、并求最大值所在的时间(若多个相同最大值取最后的时间)
3、获得以TXBPS最大值为标准的,最大的n条记录。
4、同时在该时间域中在最大值时间点之后,比RXBPS(TXBPS)最大值小的的最靠前的一个时间点为恢复时间。
最终结果 为 Equip_id,ifinde,RXBPS的最大值,RXBPS的最大值所在时间,RXBPS的最大值恢复时间,TXBPS的最大值,TXBPS的最大值所在时间,TXBPS的最大值恢复时间.
数据库数据级在 2-3亿条数据
之前我们做了一个查询方法不过效率很低。30多分钟都出不来数据。请大家帮帮忙啊。客户成天催,都弄了1个多月了。
下面把我们的sql方案给大家看看。抛砖引玉
select vt. *,
(select to_char(min(collectdate), 'YYYY-MM-DD HH24:mi:ss')
from NETWORK_FLOWTABLE
where COLLECTDATE > to_date(maxttime, 'YYYY-MM-DD HH24:mi:ss')
and COLLECTDATE <=
to_date('2011-05-05 00:00:00', 'YYYY-MM-DD HH24:mi:ss') --结束时间
and equip_id = vt.equip_id
and ifindex = vt.IFINDEX
and TXBPS < vt.t_max) tptime,
(select to_char(min(collectdate), 'YYYY-MM-DD HH24:mi:ss')
from NETWORK_FLOWTABLE
where COLLECTDATE > to_date(maxrtime, 'YYYY-MM-DD HH24:mi:ss')
and COLLECTDATE <=
to_date('2011-05-05 00:00:00', 'YYYY-MM-DD HH24:mi:ss') --结束时间
and equip_id = vt.equip_id
and ifindex = vt.IFINDEX
and RXBPS < vt.r_max) rptime
from (select v. *,
(select to_char(max(collectdate), 'YYYY-MM-DD HH24:mi:ss')
from NETWORK_FLOWTABLE
where COLLECTDATE >=
to_date('2009-05-05 00:00:00', 'YYYY-MM-DD HH24:mi:ss') --开始时间
and COLLECTDATE <=
to_date('2011-05-05 00:00:00', 'YYYY-MM-DD HH24:mi:ss') --结束时间
and equip_id = v.equip_id
and ifindex = v.IFINDEX
and TXBPS = v.t_max) maxttime,
(select to_char(max(collectdate), 'YYYY-MM-DD HH24:mi:ss')
from NETWORK_FLOWTABLE
where COLLECTDATE >=
to_date('2009-05-05 00:00:00', 'YYYY-MM-DD HH24:mi:ss') --开始时间
and COLLECTDATE <=
to_date('2011-05-05 00:00:00', 'YYYY-MM-DD HH24:mi:ss') -结束时间
and equip_id = v.equip_id
and ifindex = v.IFINDEX
and RXBPS = v.r_max) maxrtime
from (select EQUIP_ID, r_avg, t_max, r_max, t_avg, IFINDEX
from (select EQUIP_ID,
IFINDEX,
max(TXBPS) as t_max,
avg(TXBPS) as t_avg,
max(RXBPS) as r_max,
avg(RXBPS) as r_avg
from NETWORK_FLOWTABLE n
where COLLECTDATE >=
to_date('2009-05-05 00:00:00',
'YYYY-MM-DD HH24:mi:ss')
and COLLECTDATE <=
to_date('2011-05-05 00:00:00',
'YYYY-MM-DD HH24:mi:ss')
group by IFINDEX, EQUIP_ID
order by t_max desc)
where rownum <= 10 --TOPN
) v) vt