UPDATE  t1
     SET (report_date,report_status) =(
           SELECT t2.create_date,t2.report_status  
           FROM  t2
           WHERE t2.mr_msgid=t1.mt_msgid
             AND t2.create_date>=sysdate-1 
             AND t2.create_date<sysdate-1+1/24
             AND ROWNUM=1
         )
  WHERE EXISTS (
           SELECT 1
           FROM  t2
           WHERE t2.mr_msgid=t1.mt_msgid
              AND t2.create_date>=sysdate-1 
              AND t2.create_date<sysdate-1+1/24
        );问题:这个SQL以前正常执行,现在异常缓慢,几乎是死锁状态属性:1。t1,t2都是两千多万的数据量。
      2。msgid均有索引。
      3。create_date字段都为按月分区字段,而且此字段也有索引。
      4。msgid几乎是全剧唯一的数据库版本:9I
数据配置:共享池80MB 
          高速缓存:864MB
     SGA总容量:1009MB
     高速缓存命中百分比  50%

解决方案 »

  1.   

    --你的语句有点问题吧:)这样不就可以吗?UPDATE  t1
    SET (report_date,report_status) =(
               SELECT t2.create_date,t2.report_status  
               FROM  t2
               WHERE t2.mr_msgid=t1.mt_msgid
                 AND t2.create_date>=sysdate-1 
                 AND t2.create_date<sysdate-1+1/24
                 AND ROWNUM=1
             )
      

  2.   

    如果实际更新的行数不多,建议使用游标,Oracle的游标性能很高的。
    第一步:找出create_date,t2.report_status不同的行=〉PL/SQL TABLE(bulk);
    第二步:Batch Update;
      

  3.   

    这个SQL以前正常执行,现在异常缓慢查v$session_wait或者做10046跟踪,也可能要重新对表进行analyze,执行计划有可能变了.
    说实在的共享池80MB小了点.
      

  4.   

    上个问题,我在UPDATE的最后又加了一遍时间控制,于是执行计划里COST就变为以前的1/10。当时棘手的问题,算基本解决。
    我用游标试了一下,逐条执行,速度也比较快。循环次数大约在两万次。我想知道,用游标一般能保持较高性能的情况下,循环次数的上限是多少呢?