如何批量更新具有大数据的表

时间:2018-07-03 16:10:29

标签: sql oracle plsql

我必须用oracle另一个表中列的内容更新一个表中的列。由于这些表每个都有大约400万条记录,因此我面临着进行更新的困难。

表A结构(临时表)

Col1    Col2    Col3    Col4
L1      P1      PC1     D1
L2      P2      PC2     D1
L3      P3      PC3     D2
L4      P3      PC3     D3

表B结构

Col1    Col2    Col3
E1      P1      F1
E2      P1      F2
E3      P2      F3
E4      P3      F4
E5      P4      F5

我需要用匹配表 A 中的 Col4 中的值更新表B 中的 Col3 表A和B 中的 Col2

我尝试使用merge命令,但是由于这2个表具有数百万条记录,因此我们在temp表上遇到了空间问题。

我使用的合并命令是

merge into b
using
(select col2,col4 from a) c
on c.col2=b.col2
when matched then update set b.col3=c.col4;

是否有更好的方法来处理此批量更新?

1 个答案:

答案 0 :(得分:0)

对于400万行,我将检查是否可能造成短暂的停机,然后尝试

RENAME b TO b_old;

CREATE TABLE b AS 
SELECT col1, col2, coalesce(a.col4, b_old.col3) as col3
  FROM b_old 
  LEFT JOIN a ON a.col2 = b_old.col2;

Recreate indexes, constraints, comments etc on b

DROP TABLE b_old;

如果那仍然太慢,我将对两个表进行分区,然后像并行运行重新创建一样。