【问题标题】:Updating huge amount of rows更新大量行
【发布时间】:2016-11-01 15:25:28
【问题描述】:

我有两个表 TESTING 和 TESTING_BCK,它们都有相同的列。 例如。

测试

NR | KEY1 | KEY2 | ... | KEY7 | COMMENTS
 1  |  ...                     | example1
 1  |  ...                     | example2
 ..... and thousands with NR = 1 more
 2  |  ...                     |  null
 2  |  ...                     |  null
 ..... and again many many more  

TESTING_BCK

NR | KEY1 | KEY2 | ... | KEY7 | COMMENTS
 2  |  ...                     |  example
 2  |  ...                     |  'this should go to TESTING'
 ..... and again many many more 

现在我想更新 TESTING,因此 TESTING_BCK 的 COMMENTS 也将成为 TESTING 的 COMMENTS(基于键)。我知道 TESTING_BCK 中的所有条目肯定在 TESTING 中有一个具有相同键和 NR 的条目。 到目前为止,我是这样做的:

UPDATE TESTING
SET COMMENTS = (
        SELECT COMMENTS
        FROM TESTING_BCK
        WHERE TESTING_BCK.NR = TESTING.NR
            AND TESTING_BCK.KEY1 = TESTING.KEY1.....TESTING_BCK.KEY7 = TESTING.KEY7
        )
WHERE EXISTS (
        SELECT COMMENTS
        FROM TESTING_BCK
        WHERE TESTING_BCK.NR = TESTING.NR
            AND TESTING_BCK.KEY1 = TESTING.KEY1
            AND...
        )

但是当我对成千上万个条目执行此操作时,这将花费很长时间。有什么想法可以更新 TESTING 吗?

结果应该是:

测试

    NR | KEY1 | KEY2 | ... | KEY7 | COMMENTS
     1  |  ...                     | example1
     1  |  ...                     | example2
     ..... and thousands with NR = 1 more
     2  |  ...                     |  example
     2  |  ...                     |  'this should go to TESTING'
     2  |  ...                     |  comment from TESTING_BCK
     ......

【问题讨论】:

  • 不确定“永远”是什么意思(一小时、一天、12 周等),但这是一次更新吗?或者这是否意味着按某个时间表/频率运行?
  • 你有什么索引?如果我们真的只是在谈论数千行和超过几秒钟的经过时间,我猜你缺少表上的索引和约束。
  • @tbone 这意味着要经常运行。我的意思是“永远”,10.000 个条目需要几分钟,但我通常有数百万个需要“永远”。我正在尽我所能提高性能。
  • @JustinCave 谢谢,我在桌子上遇到了一些限制,但我会寻找更多限制并检查索引。

标签: sql oracle performance sql-update


【解决方案1】:

我认为你应该使用

UPDATE 
(SELECT TESTING.COMMENTS as OLD, TESTING_BCK.COMMENTS as NEW
 FROM TESTING
 INNER JOIN TESTING_BCK
 ON TESTING_BCK.NR = TESTING.NR AND TESTING_BCK.KEY1 = TESTING.KEY1 ..... TESTING_BCK.KEY7 = TESTING.KEY7
) t
SET t.OLD = t.NEW

【讨论】:

  • 但这不会更新 TESTING,是吗?表“t”不是真正的表。
  • 这个 qeury 应该更新结果表的行。映射真实表..应该可以工作..基于ORACLE sintax .. .
  • 我想你误解了我的意思。我想更新 TESTING 而没有其他表。当我说“结果应该是:”时,我的意思是更新后 TESTING 应该是这样的。还是我现在误解了你,因为我尝试时该查询不起作用。
  • 01779。 00000 - “无法修改映射到非保留键表的列” *原因:尝试插入或更新映射到非保留键表的连接视图的列。 *Action:直接修改底层基表
  • 这种错误是因为在查询建议的情况下,Oracle 无法保证每个表中的行之间完全匹配,因此更新的唯一方法..是您提供的方法。 .这意味着不可能..性能改进..(如果您已经设置了适当的索引..否则..为两个表设置适当的redundenced索引)
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2014-05-12
  • 1970-01-01
  • 2010-12-19
相关资源
最近更新 更多