select a,b,c,count(*) from table1 where rq<to_date('2004.1.1','yyyy.mm.dd') group by a,b,c
rq有索引,查询时间810秒
目前考虑
1、增加sort_area_size 20M
2、建立符合索引rq,a,b,c,觉得不可能。但是,这样可以大大提高速度,耗时在30多秒。
3、增大databuffer
4、增加VEH_INDEX1表空间于不同的驱动器,提高I/O
5、db_file_multiblock_read_count 由8增大到16,提高读取的速度执行计划如下:
SELECT STATEMENT, GOAL = CHOOSE
 SORT GROUP BY
  TABLE ACCESS BY INDEX ROWID table1  这儿的耗时是最多的。
   INDEX RANGE SCAN table_rq 还有其他地方要考虑吗?

解决方案 »

  1.   

    Sort_Area_Size 太大的话会不会引起块错误?
      

  2.   

    至于遍历整张表是肯定的,如果要加速度的话,我想a.b.c.都要加索引吧
      

  3.   

    try:
    增大
    db_block_buffers
      

  4.   

    2、建立符合索引rq,a,b,c,觉得不可能。但是,这样可以大大提高速度,耗时在30多秒。
    建立的索引group by a,b,c符合了的用途!
    不错,关注高手!
      

  5.   

    bzszp(SongZip)的‘如果可能的话,按照日期的顺序重建该表’,这方法是不错!
    但是考虑表分区,我觉得速度上应该不会影响很大!
      

  6.   

    我个人理解: 分区 和 按照某列按照顺序进行存放 效果应该是差不多的
    都是便于检索某一段数据时,不需要 index scans ,直接顺序读取数据块
    对于那些行长度比较小的表来说,会比较好
      

  7.   

    对于这中SQL,就是有索引rq也几乎是全表扫描.
    如果不建索引rq,a,b,c.
    别的任何办法,都不能根本上解决问题.
    将记录Archive到别的表上吧.
      

  8.   

    并不是在所有场合都是index scan比full table scan快,如果满足条件
    rq<to_date('2004.1.1','yyyy.mm.dd') 的纪录超过总纪录数的20%,那就应该选择full table scan而不是index scan。在多cpu服务器上,使用parallel能极大地提高速度。下面是我测试的结果:
    1.) full index scan
    11:25:12 SQL> select count(*) from fcst_eu;
      COUNT(*)
    ----------
     145316637
    Elapsed: 00:06:32.032). full table scan + parallel
    11:39:51 SQL> select /*+ parallel(x 24) full(x) */ count(*) from fcst_eu x
      COUNT(*)
    ----------
     145316637
    Elapsed: 00:00:57.87
      

  9.   

    看了各位高手的讨论,我觉的可以有两种实现方案
    1、bzszp(SongZip):  重新按照日期建立表,如何实现?
    2、 KingSunSha(弱水三千) :select /*+ parallel(x 24) full(x) */ count(*) from fcst_eu x解释下/*+ parallel(x 24) full(x) */ 什么意思?
    大家继续讨论。
      

  10.   

    1、bzszp(SongZip):  重新按照日期建立表,如何实现?
    是通过create table newtablename as select * from oldtablename order by rq;
    2、 KingSunSha(弱水三千) :select /*+ parallel(x 24) full(x) */ count(*) from 
    fcst_eu x
    是建议数据采用全扫描的方式进行查询!
      

  11.   

    今天早上起来对这个问题进行了考虑,是不是可以把整个表cache到内存中,然后进行全表扫描呢?
    如果cache到内存中,应该如何实现?会影响对表的修改操作吗?
      

  12.   

    如果能容纳的话,当然好了alter table tbname cache;
      

  13.   

    select  /*+ parallel(x 24) full(x) */cllx, syxz, count(*) byl,xzqh from vehicle where
        CCDJRQ<to_date('2004-06-20','yyyy/mm/dd')+1 and
        not (ZT like '%B%' or ZT like '%E%' or ZT like '%M%') and clly='1'  group by xzqh,cllx,syxz
    看了执行计划怎么还是使用日期index索引呢
      

  14.   

    bzszp(SongZip) :
         如果做一般的插入删除,数据会写盘吗,还是关闭数据库最后写盘呢?
      

  15.   

    /*+ parallel(x 24) full(x) */这些资料那有的看24代表什么意思?
      

  16.   

    首否首先给rq建立索引,最好簇集索引或者
    按索引组织同时索引rq,a,b,c
      

  17.   

    通过dbwn进程来管理写数据文件。
    24代表分为24个线程吧,好像是这个意思来者。