-- 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秒,真得难以忍受。
请问有无好的办法?用存储过程处理?
请求各位大侠帮忙。

解决方案 »

  1.   

    现在的是每月产生440万条数据,我把这些数据放到历史表如ola_performance_data200409中,现在的ola_performance_data是这所有历史表的视图。
      

  2.   

    看一下执行计划,是否有full table scan发生。
      

  3.   

    大侠,full table scan是否发生怎么看
      

  4.   

    用 pl/sql developer工具,里面有explain plan功能。
      

  5.   

    在pl/sql develper中,我点explain plan了可不知道在什么地方看。
      

  6.   

    用鼠标选择你的语句,点explain plan
      

  7.   

    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
      

  8.   

    不好意思,刚才的有点乱
    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
      

  9.   

    语句已经合理的是用了索引,是数据量太大了。首先,增大shared_pool_size的参数。
    如果可以使用多个磁盘的话,考虑把表分散到不同的磁盘上,也就是说,在不同的磁盘上创建数据文件,
    存放这些表,比如有3个磁盘可用
    可以这样:1号盘存放1,4,7,10 月份的表 2号盘存放2,5,8,11月份的表 3号盘存放3,6,9,12月份的表 
    这样的话,可以最大限度的提高i/o效率。
      

  10.   

    如果你只查询索引列的数据的话,效率会更高
    也就是最多显示DATA_ID,GROUPID,YMD,TIMING这些信息的话。
    你可以做一下试验看一下效果。另外,try:
    重新创建索引
    create index idx_data_id_value on OLA_ULLAGE_DATA(data_id,data_value);
      

  11.   

    加大data_buffers,sort_area_size的参数值,share_pool设置的差不多就可以了,不需要太大,省下的内存可以加到data_buffers上