我想更新表格中的值。给定的更新脚本将无限期地持续。 您能咨询我,如何优化此更新? 这是脚本:
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 :(得分: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它永远不会持久 - 虽然看起来好像很长一段时间!如果你有一些空闲时间,没有其他人使用该框,让它运行,看看会发生什么(你可能会用尽内存)。