2014-12-08 76 views
0

我想更新表中的值。给定的更新脚本无限期地持续。 你会咨询我,如何优化此更新? 这里是脚本:Oracle - 优化更新

UPDATE rp_dtls e 
    SET e.C_RNG =(SELECT b.cod 
       FROM (SELECT rn0.code   cod, 
         a.n_datavalue n_datavalue, 
         a.c_ins   c_ins, 
         a.related_Account related_Account, 
         a.d_periodlastday d_periodlastday, 
         a.N_PACKETINFOID N_PACKETINFOID 
       FROM (SELECT SUM(t.n_datavalue) n_datavalue, 
           t.c_ins, 
           t.related_Account, 
           t.d_periodlastday, 
           t.N_PACKETINFOID 
         FROM rp_dtls t 
         WHERE t.d_periodlastday = to_date('31.10.2014', 'DD.MM.YYYY') 
          AND t.n_packetinfoid = (SELECT MAX(N_PACKETINFOID) 
           FROM rp_dtls 
           WHERE d_periodlastday = 
             to_date('31.10.2014', 'DD.MM.YYYY')) 
          AND t.c_ins IN ('F04000', 'F02205') 
         GROUP BY t.c_ins, 
           t.related_Account, 
           t.d_periodlastday, 
           t.N_PACKETINFOID, 
           t.c_ins) a 
       LEFT JOIN rp_rng rn0 
        ON a.n_datavalue BETWEEN rn0.val_min AND rn0.val_max) b 
     WHERE b.c_ins = e.c_ins 
      AND b.related_Account = e.related_Account 
      AND b.d_periodlastday = e.d_periodlastday 
      AND b.N_PACKETINFOID = e.N_PACKETINFOID)** 

在此先感谢!

+0

您可以做的第一件事是从子查询select语句中删除不需要的列 – 2014-12-08 08:14:16

+0

感谢您的反馈,但我只能删除一列,我需要加入其他列:( – Elena 2014-12-08 08:43:40

+0

rp_dtls的主键是什么 – psaraj12 2014-12-08 09:49:33

回答

0

您有几个疑问 - 将其分解为例如需要多长时间才能执行

SELECT SUM(t.n_datavalue) n_datavalue, 
          t.c_ins, 
          t.related_Account, 
          t.d_periodlastday, 
          t.N_PACKETINFOID 
        FROM rp_dtls t 
        WHERE t.d_periodlastday = to_date('31.10.2014', 'DD.MM.YYYY') 
         AND t.n_packetinfoid = (SELECT MAX(N_PACKETINFOID) 
          FROM rp_dtls 
          WHERE d_periodlastday = 
            to_date('31.10.2014', 'DD.MM.YYYY')) 
         AND t.c_ins IN ('F04000', 'F02205') 
        GROUP BY t.c_ins, 
          t.related_Account, 
          t.d_periodlastday, 
          t.N_PACKETINFOID, 
          t.c_ins 

您应该查看每个语句的查询计划,例如解释选择计划... 这可能会建议在d_periodlastday,c_ins或N_PACKETINFOID上添加索引。您尝试更新的列上的索引可能会降低更新速度,因为它们需要重建部分索引。

因此,打入阶段和时间并分析查询的各个部分。

PS它不会永远持续 - 虽然它可能看起来很长时间!如果你有空闲时间,没有其他人正在使用这个盒子,让它运行,看看会发生什么(你可能会耗尽内存)。

+0

非常感谢!我会尝试 – Elena 2014-12-08 09:41:52

+0

如果您喜欢它,请接受答案,谢谢。 – kayakpim 2014-12-08 14:47:03