Oracle - 优化更新

时间:2014-12-08 08:09:09

标签: sql oracle oracle-sqldeveloper

我想更新表格中的值。给定的更新脚本将无限期地持续。 您能咨询我,如何优化此更新? 这是脚本:

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)**

提前致谢!

1 个答案:

答案 0 :(得分: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它永远不会持久 - 虽然看起来好像很长一段时间!如果你有一些空闲时间,没有其他人使用该框,让它运行,看看会发生什么(你可能会用尽内存)。