有两个表,一个是根据第二个表进行更新。 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)
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的解决方案将无效