优化sql更新语法而不是服务器

时间:2013-11-12 05:34:31

标签: sql oracle optimization oracle11g query-optimization

有两个表,一个是根据第二个表进行更新。 SQL正在运行,但由于记录数量的原因,我认为它需要花费太多时间。见this小提琴。实际主表包含1,500,000,子包含700,000条记录,以下sql保持执行4小时,因此终止。

UPDATE master m SET m.amnt = (SELECT amnt FROM child c WHERE c.seqn = m.seqn)
WHERE m.seqn IN (SELECT seqn FROM child);

这个sql的执行计划是(Red one是master,other是child)

enter image description here

seqn是主键。毫无疑问,这一切都取决于服务器的性能和指数统计。但是,令我困扰的是索引没有访问master,而且正在读取子项两次。有可能sql被优化但是oracle决定以这种方式进行,但是我试图优化sql为

UPDATE (
SELECT m.seqn m_seqn,c.seqn c_seqn, c.amnt c_amnt, m.amnt m_amnt
FROM master m INNER JOIN child c ON m.seqn = c.seqn) 
SET m_amnt = c_amnt

导致以下错误

ORA-01779: cannot modify a column which maps to a non key-preserved 
table : UPDATE ( SELECT m.seqn m_seqn,c.seqn c_seqn, c.amnt c_amnt, m.amnt m_amnt 
FROM master m INNER JOIN child c ON m.seqn = c.seqn) SET m_amnt = c_amnt

除了更新统计数据和调整服务器之外,有什么办法可以优化SQL吗?

编辑如果要加入的列不是PK,@ Sebas的解决方案将无效

0 个答案:

没有答案