-- Create table
create table OLA_ULLAGE_DATA
(
DATA_ID VARCHAR2(6) not null,
GROUPID CHAR(2) not null,
YMD CHAR(10) not null,
TIMING CHAR(8) not null,
REAL_DATA FLOAT,
ULLAGE_DATA FLOAT
)
主键为:DATA_ID,GROUPID,YMD,TIMING
同时分别在DATA_ID,GROUPID,YMD,TIMING建立了索引。
大约每五分钟产生510条数据,。
ymd 为2004-11-01格式
timing为13:05:00格式
groupid共四个值11,12,23,24
data_id大约有100多个。DATA_ID GROUPID YMD TIMING DATA_VALUE
------- ------- ---------- -----------------------
WT06 23 2004-09-27 22:00:00 22
WT08 23 2004-09-27 22:00:00 2
WT09 23 2004-09-27 22:00:00 22
WT10 23 2004-09-27 22:00:00 2
现在要产生纵表:
select ymd||' '||substr(timing,1,5),
GroupId,
round(sum(case Data_Id when 'S5P06' then Data_Value else null end),2) as s5p06 ,
round(sum(case Data_Id when 'WT01' then Data_Value else null end),2) as WT01 ,
round(sum(case Data_Id when 'WT02' then Data_Value else null end),2) as WT02
from Ola_performance_data where GroupId='12' and ymd<'2004-09-20' and ymd>='2004-09-19'
group by ymd,timing,GroupId order by ymd,timing,GroupId 得到如下:
YMD||''||SUBSTR(TIMING,1,5) GROUPID S5P06 WT01 WT02
--------------------------- ------- ---------- ---------- ----------
2004-09-19 22:55 12 -96.17 2.99 -2.09
2004-09-19 23:00 12 -96.19 2.95 -2.16
2004-09-19 23:05 12 -96.16 3 -2.04
2004-09-19 23:10 12 -96.2 2.96 -2.15
2004-09-19 23:15 12 -96.18 2.99 -2.11
2004-09-19 23:20 12 -96.2 2.91 -2.14
2004-09-19 23:25 12 -96.22 2.9 -2.11
2004-09-19 23:30 12 -96.2 2.94 -1.99
2004-09-19 23:35 12 -96.19 2.98 -2.04
2004-09-19 23:40 12 -96.2 2.93 -1.99
2004-09-19 23:45 12 -96.19 2.95 -2
2004-09-19 23:50 12 -96.16 3.02 -1.87
2004-09-19 23:55 12 -96.06 3.19 -1.89可是现在遇到一个问题,当我搜索的时间范围比较长时由于数据量特别大,所以特别费时间,如2004-07-15~2004-11-01大约需要640秒,真得难以忍受。
请问有无好的办法?用存储过程处理?
请求各位大侠帮忙。
create table OLA_ULLAGE_DATA
(
DATA_ID VARCHAR2(6) not null,
GROUPID CHAR(2) not null,
YMD CHAR(10) not null,
TIMING CHAR(8) not null,
REAL_DATA FLOAT,
ULLAGE_DATA FLOAT
)
主键为:DATA_ID,GROUPID,YMD,TIMING
同时分别在DATA_ID,GROUPID,YMD,TIMING建立了索引。
大约每五分钟产生510条数据,。
ymd 为2004-11-01格式
timing为13:05:00格式
groupid共四个值11,12,23,24
data_id大约有100多个。DATA_ID GROUPID YMD TIMING DATA_VALUE
------- ------- ---------- -----------------------
WT06 23 2004-09-27 22:00:00 22
WT08 23 2004-09-27 22:00:00 2
WT09 23 2004-09-27 22:00:00 22
WT10 23 2004-09-27 22:00:00 2
现在要产生纵表:
select ymd||' '||substr(timing,1,5),
GroupId,
round(sum(case Data_Id when 'S5P06' then Data_Value else null end),2) as s5p06 ,
round(sum(case Data_Id when 'WT01' then Data_Value else null end),2) as WT01 ,
round(sum(case Data_Id when 'WT02' then Data_Value else null end),2) as WT02
from Ola_performance_data where GroupId='12' and ymd<'2004-09-20' and ymd>='2004-09-19'
group by ymd,timing,GroupId order by ymd,timing,GroupId 得到如下:
YMD||''||SUBSTR(TIMING,1,5) GROUPID S5P06 WT01 WT02
--------------------------- ------- ---------- ---------- ----------
2004-09-19 22:55 12 -96.17 2.99 -2.09
2004-09-19 23:00 12 -96.19 2.95 -2.16
2004-09-19 23:05 12 -96.16 3 -2.04
2004-09-19 23:10 12 -96.2 2.96 -2.15
2004-09-19 23:15 12 -96.18 2.99 -2.11
2004-09-19 23:20 12 -96.2 2.91 -2.14
2004-09-19 23:25 12 -96.22 2.9 -2.11
2004-09-19 23:30 12 -96.2 2.94 -1.99
2004-09-19 23:35 12 -96.19 2.98 -2.04
2004-09-19 23:40 12 -96.2 2.93 -1.99
2004-09-19 23:45 12 -96.19 2.95 -2
2004-09-19 23:50 12 -96.16 3.02 -1.87
2004-09-19 23:55 12 -96.06 3.19 -1.89可是现在遇到一个问题,当我搜索的时间范围比较长时由于数据量特别大,所以特别费时间,如2004-07-15~2004-11-01大约需要640秒,真得难以忍受。
请问有无好的办法?用存储过程处理?
请求各位大侠帮忙。
SORT GROUP BY 18 137 6028
VIEW JJDD_DBO VIEW_PERFORMANCE_HIS 19 137 6028
SORT UNIQUE 19 137 6028
UNION-ALL
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200408 3 41 1804
INDEX RANGE SCAN JJDD_DBO SYS_C003980 2 7413
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200409 2 47 2068
INDEX RANGE SCAN JJDD_DBO PK_OLA_PERFORMANCE0409_JZ 1 7506
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200407 1 1 44
INDEX RANGE SCAN JJDD_DBO SYS_C003974 2 1
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200410 1 1 44
INDEX RANGE SCAN JJDD_DBO IDX_OLA_PERFORMANCE0409_JZ 1 2
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200409 2 47 2068
INDEX RANGE SCAN JJDD_DBO PK_OLA_PERFORMANCE0409_JZ 1 7506
SELECT STATEMENT, GOAL = ALL_ROWS 18 137 6028
SORT GROUP BY 18 137 6028
VIEW JJDD_DBO VIEW_PERFORMANCE_HIS 19 137 6028
SORT UNIQUE 19 137 6028
UNION-ALL
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200408 3 41 1804
INDEX RANGE SCAN JJDD_DBO SYS_C003980 2 7413
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200409 2 47 2068
INDEX RANGE SCAN JJDD_DBO PK_OLA_PERFORMANCE0409_JZ 1 7506
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200407 1 1 44
INDEX RANGE SCAN JJDD_DBO SYS_C003974 2 1
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200410 1 1 44
INDEX RANGE SCAN JJDD_DBO IDX_OLA_PERFORMANCE0409_JZ 1 2
TABLE ACCESS BY INDEX ROWID JJDD_DBO OLA_PERFORMANCE_DATA200409 2 47 2068
INDEX RANGE SCAN JJDD_DBO PK_OLA_PERFORMANCE0409_JZ 1 7506
如果可以使用多个磁盘的话,考虑把表分散到不同的磁盘上,也就是说,在不同的磁盘上创建数据文件,
存放这些表,比如有3个磁盘可用
可以这样:1号盘存放1,4,7,10 月份的表 2号盘存放2,5,8,11月份的表 3号盘存放3,6,9,12月份的表
这样的话,可以最大限度的提高i/o效率。
也就是最多显示DATA_ID,GROUPID,YMD,TIMING这些信息的话。
你可以做一下试验看一下效果。另外,try:
重新创建索引
create index idx_data_id_value on OLA_ULLAGE_DATA(data_id,data_value);