本帖最后由 mvsean 于 2009-10-15 09:25:06 编辑

解决方案 »

  1.   

    我试着跑了3个月的数据,Oracle 给出的顺序是  1.CTF_INDEX1 INDEX(RANGE SCAN)
      2.CTF TABLE ACCESS(BY INDEX ROWID)
      3.SORT(GROUP BY)
       4.INsert
       
        执行时间3小时,3个月的数据。
         
      

  2.   


    用EXPLAIN PLAN 分析下,看看cost是多少..建议:
    1.用Hint 提示减少操作时间
       INSERT   /*+Append*/   INTO     tab1 
                    SELECT   *   FROM   tab2;2. 采用不写日志及使用Hint提示减少数据操作的时间。
    建议方案是先修改表为不写日志: 
    sql> alter   table   table_name   NOLOGGING; 
    插入数据:
    INSERT   /*+Append*/   INTO     tab1 
          SELECT   *   FROM   tab2;
    插入完数据后,再修改表写日志: 
    sql> alter   table   table_name   LOGGING; 
    这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。3. 在相关列上建索引, 注意,如果code列上有索引,code <> '000000000000000' 将会限制索引,应改成code < '000000000000000' and code > '000000000000000'  
      

  3.   

    insert 的时候,你可以看一下执行计划.....
      

  4.   

    非常感谢,我来按前辈说的来做。 
    关于第三点,我也曾看文章中提到过, <> 会限制索引, >= <= 也会限制索引么?
    我当时看到文章中提到后自己试过,就 select * from 而言,当时感觉不到 <> 有限制索引。
    今天你再次提到,我又测了下,确实在 count() sum() 聚集的时候,有明显的差异。
      

  5.   

    对于此sqlcode <> '000000000000000' And getdate >= '20080101' And getdate <= '20081231' ,做如下优化:1,将code <> '000000000000000' 换成 code in ('000000000000000')2,将getdate >= '20080101' 换成 getdate > '20071231' 3,将getdate <= '20081231' 换成 getdate < '20090101' 
      

  6.   

    你把这历史数据的执行可以做个JOB放到半夜去执行
      

  7.   

    7楼的sql语句优化方案比较完整