【发布时间】:2019-05-19 15:52:20
【问题描述】:
我有一个包含两个表 ABC 和 EXT_ABC 的过程。 EXT_ABC 表加载了每日数据(EXT_ABC 在每天结束时被截断),ABC 加载了来自 EXT_ABC 的每日数据以维护历史。现在有时 EXT_ABC 会为 ABC 表中已经存在的 ID 带来更新数据,因此我们使用以下逻辑。
DELETE FROM ABC WHERE ID IN ( SELECT ID FROM EXT_ABC);
commit;
INSERT INTO ABC
select * from EXT_ABC;
上面的逻辑是快速还是我可以做以下优化流程。
INSERT INTO ABC
select * from EXT_ABC where ID not in (SELECT ID FROM ABC );
两个表的 ID 列都有索引。
【问题讨论】:
-
第二个查询应该更快,但我不明白你在这两种情况下要做什么。
-
我正在从 EXT_ABC 向 ABC 表中插入数据。但这需要时间,我想优化查询,因为我每天必须插入 600 万+条记录。
-
如果 EXT_ABC 包含 ABC 中已经存在的 ID,那么其余数据是否也与 ABC 中已经存在的数据相同?如果是这样,那么您的第二个查询会更快。如果没有,您是否要更新 ABC 中的数据?如果没有,那么您的第二个查询仍然是要走的路。如果您想更新匹配的记录,那么您需要使用第一个查询,或者使用更新语句然后插入语句,或者使用 MERGE 语句和当匹配时更新子句。
标签: sql optimization oracle11g sql-delete procedure