【发布时间】:2019-11-13 08:18:16
【问题描述】:
我想根据联接更新列。不幸的是,我正在更新和合并的表相当大:87,220,021 行。
这是表格的内容(我正在与自己合并):
ID ID_VERSION VALUE_1 VALUE_2 RES_EXPEC
1 1 A NULL NULL
1 2 A NULL 1
1 2 B NULL NULL
1 3 B NULL 1
2 1 A NULL NULL
2 1 B NULL NULL
2 1 B NULL NULL
这是我正在运行的代码:
MERGE INTO EXAMP_TAB USING(
SELECT ID, ID_VERSION, VALUE_1 FROM EXAMP_TAB) TAB_B
ON (EXAMP_TAB.ID = TAB_B.ID
AND EXAMP_TAB.ID_VERSION = (TAB_B.ID_VERSION - 1)
AND EXAMP_TAB.VALUE_1 = TAB_B.VALUE_1)
WHEN MATCHED THEN
UPDATE SET EXAMP_TAB.VALUE_2 = 1;
此操作的目的是检查之前版本的ID中是否存在VALUE_1中具有相同值的条目。如果是,则更新 VALUE_2。
很遗憾,此操作需要数小时。我阅读了一些关于索引的内容,但似乎它们对我没有帮助,因为它们不会提高 UPDATE 操作的性能。
我也对不涉及合并语句的操作持开放态度。
【问题讨论】:
-
您是否考虑过不将该数据存储在附加列中,而是通过在查询中加入来选择它?那种计算出来的数据总是很难维护,以后会很头疼……
-
这里的预期输出是什么?因为您的查询不会更新
ID = 2的任何记录 -
@ Tejash 是的,如果没有第二个版本的 ID = 2 与 A 和 B 这些行将保持 NULL。这就是我想要的。
-
@Radagast81 哪些数据以及如何做到这一点:)?
-
(ID, ID_VERSION) = (1,3)-- 它将有前两行,即(1,2),那么需要比较哪一行? -- 如果您能分享预期的输出结果会更好,以便我们为您提供帮助。
标签: sql oracle query-performance sql-merge