【问题标题】:what satement is executed fast in oracle, Delete+insert OR insert where ID not in list.?在 oracle 中快速执行什么语句,删除 + 插入或插入 ID 不在列表中。?
【发布时间】: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


【解决方案1】:

听起来像 Merge 语句可能在这里有用,例如:

merge into abc tgt
  using ext_abc src
  on (tgt.id = src.id)
when not matched then
  insert (<list of target table columns>)
  values (<list of source table columns>);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多