提问人:tanatan 提问时间:8/3/2021 最后编辑:KNCKtanatan 更新时间:8/3/2021 访问量:169
如何比较和更新预言机表中的数百万条记录?[已结束]
How to compare and update millions of records in a oracle table? [closed]
问:
我们每天都会收到一个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示例吗?
非常感谢。
答:
将所有偏移量更新为 1
更新主集偏移量 = 1
将“每日”中行的所有偏移量更新为 1
更新主集偏移量 = 0 where id in(从 Daily 中选择 id)
插入偏移量为 null 的行
插入到主 (id, ... , offset ) select (id, ..., null) from Daily
是否可以比较两个表并以批量方式同时更新它们?
您似乎想要类似的东西:
-- 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);
评论