如何比较和更新预言机表中的数百万条记录?[已结束]

How to compare and update millions of records in a oracle table? [closed]

提问人:tanatan 提问时间:8/3/2021 最后编辑:KNCKtanatan 更新时间:8/3/2021 访问量:169

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

2年前关闭。

我们每天都会收到一个CSV文件,其中包含数百万条记录。每条记录都由唯一的 ID 标识。

第 1 天,将每日文件加载到“Master”表中。该表的结构是相同的文件加上一个名为 offset 的列。最初,此列的值留空/null。

从第 2 天开始,将每日文件加载到“每日”表中。比较“每日”表和“主”表,并更新如下:

a) “Daily”表中存在但“Master”表中不存在的任何记录(由唯一 Id 列标识)都将添加到“Master”表中,偏移列值设置为空白/null。

b) 两个表中存在的任何记录,“主”表中“偏移量”列的值将重置为 0。

c) 任何不存在“每日”表但存在于“主”表中的记录,“主”表中“偏移”列的值将增加 1。

归根结底,我们必须生成 3 个文件,为此我们可以执行以下活动:

为主表中的所有新记录创建一个添加文件。从 Master 表中,生成一个文件,其中 offset column = null/blank。

为主表中偏移列> 100 的所有记录创建删除文件。

从主表创建一个累积文件,其中偏移列 <= 100

从偏移列> 100 的主表中删除记录。

有一些 NFR,即累积文件可以有 2000 万条记录,我们有大约 30 分钟的时间来执行上述练习。

我们希望避免使用循环的迭代方法,最好使用某种批量比较和更新。

是否可以比较两个表并以批量方式同时更新它们。你能帮我一些SQL示例吗?

非常感谢。

SQL Oracle 比较 bulkinsert bulkupdate

评论

2赞 astentx 8/3/2021
为什么你问之前关闭时问的问题完全一样?你有没有检查过这个:如果一个问题被“关闭”,这意味着什么?
0赞 tanatan 9/7/2021
@astentx:我改写了这个问题,所以它不是一个意见问题。我以为这就是它第一次关闭的原因。

答:

1赞 AIMIN PAN 8/3/2021 #1
  1. 将所有偏移量更新为 1

    更新主集偏移量 = 1

  2. 将“每日”中行的所有偏移量更新为 1

    更新主集偏移量 = 0 where id in(从 Daily 中选择 id)

  3. 插入偏移量为 null 的行

    插入到主 (id, ... , offset ) select (id, ..., null) from Daily

1赞 MT0 8/3/2021 #2

是否可以比较两个表并以批量方式同时更新它们?

您似乎想要类似的东西:

-- Increment the previous offsets
UPDATE master
SET offset = COALESCE(offset + 1, 0);

-- Merge the two tables
MERGE INTO master m
USING daily d
ON (m.id = d.id)
WHEN MATCHED THEN
  UPDATE SET offset = 0
WHEN NOT MATCHED THEN
  INSERT (id, col1, col2, col3, offset)
  VALUES (d.id, d.col1, d.col2, d.col3, NULL);