【问题标题】:Oracle SQL correlated update low performanceOracle SQL 相关更新性能低下
【发布时间】:2013-11-19 09:44:19
【问题描述】:

我必须使用其他两个表中的数据更新表 (table3)。 这两个表 (table1,table2) 都描述了单个对象,因此 table1.id 等于该单个对象的 table2.id。 表 3 是该对象的多对多映射表和另一个在这里不重要的映射表。我需要将 table1 和 table2 中的一些数据放入该映射表中。

我正在尝试使用相关查询更新 table3,但需要很长时间才能完成。我对大约 500.000 条记录的组运行了这个查询,现在它运行了一个多小时。

我在这里做错了吗?

UPDATE table3 t3
SET (t3.some_value1, t3.other_value1, t3.some_value2, t3.other_value2) =
(   SELECT t1.some_value1, t1.other_value1, t2.some_value2, t2.other_value2
    FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
    WHERE t3.fk = t1.id)
WHERE EXISTS (SELECT 1 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id WHERE t3.fk = t1.id);


SELECT * FROM table3;

SQL Fiddle

【问题讨论】:

  • 绝对是的,它递归运行。在更新前用子选择改变它
  • 你能举一些例子来说明如何改变它吗?

标签: sql oracle correlated-subquery


【解决方案1】:

使用这个:

UPDATE
      (SELECT
            T3.SOME_VALUE1 TARGET1,
            T3.OTHER_VALUE1 TARGET2,
            T3.SOME_VALUE2 TARGET3,
            T3.OTHER_VALUE2 TARGET4,
            T1.SOME_VALUE1 SOURCE1,
            T1.OTHER_VALUE1 SOURCE2,
            T2.SOME_VALUE2 SOURCE3,
            T2.OTHER_VALUE2 SOURCE4
       FROM
            TABLE1 T1
            JOIN TABLE2 T2
                ON T1.ID = T2.ID
            JOIN T3
                ON T3.FK = T1.ID)
SET
      TARGET1   = SOURCE1,
      TARGET2   = SOURCE2,
      TARGET3   = SOURCE3,
      TARGET4   = SOURCE4;

如果您遇到ORA-01779 cannot modify a column which maps to a non key-preserved table,请尝试使用UPDATE /*+ BYPASS_UJCV */ 或在 T1.ID、T2.ID、T3.FK 上添加唯一索引

【讨论】:

  • T1.ID 和 T2.ID 是我数据库中的主键,但 T3.FK 不能是唯一的,因为它是多对多映射表。但是它似乎在 SQL Fiddle 中运行良好,一旦我的错误查询结束就会尝试它。
【解决方案2】:

@SriniV 提供的答案使用了一种称为Updatable Join View 的技术。在更高版本的 Oracle 中,可以将其替换为 MERGE

合并到 t3 使用 ( 选择 t1.id t1.some_value1, t1.other_value1, t2.some_value2, t2.other_value2 从表 1 t1 加入 table2 t2 ON t1.id = t2.id 其中 1=1 和 t3.fk = t1.id ) 一个开 ( t3.fk = a.id ) 匹配时更新 SET t3.some_value = a.some_value, t3.other_value1 = a.other_value1 t3.some_value2 = a.some_value2 t3.other_value2 = a.other_value2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多