【发布时间】: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