【问题标题】:Delete+Insert (Move) DB2 OLD TABLE删除+插入(移动)DB2 OLD TABLE
【发布时间】:2012-04-27 16:40:44
【问题描述】:

我有两个表 TARGET 和 SOURCE。 我需要更新 SOURCE 表的行并将这些更新的行插入到 TARGET 表中,然后从 SOURCE 中删除原始行。 目前我首先通过SP完全更新SOURCE表,然后在另一个SP中进行Move操作。

BEGIN P1:
insert into TARGET(select * from SOURCE where col=someValue)
delete from SOURCE where col=someValue;
END P1

我也尝试过类似的东西

insert into TARGET(SELECT * FROM OLD TABLE(DELETE FROM SOURCE WHERE col=someValue))

但这在 SP 中不起作用。

我认为这是常见的情况,例如历史/存档表,必须在 DB2 中有解决方案。谁能告诉我如何在不影响性能的情况下实现这一目标?我的意思是SP不应该花很长时间来运行。我也可以删除多余的更新 SP。相反,我可以直接将更新的行插入 TARGET 并从 SOURCE 中删除相应的行吗?此外,我被建议在单个事务中进行删除和插入操作。这会导致任何性能损失吗?

【问题讨论】:

  • 事务总是有性能成本。时期。是的,这需要在交易中,否则你会冒一些可怕的风险。另外,请注意您当前的“移动”SP,即使它在交易中,也将表现得“安全”。恐怕我们需要了解更多才能确定,但​​您可能可以直接更新 Target 而无需中间表。
  • 是的,我想插入更新的行并删除旧行,而不对旧行进行冗余更新。当前使用合并的更新 sp 花费更少的时间来更新旧表,我不想通过在 sp 中引入一些单行插入和删除操作而失去性能。所以我正在寻找能够维护目标表的批量更新和旧表中相应删除的东西
  • col 是什么类型的列,并且必须它是唯一的?如果它不是唯一的,您需要使用某种标志值,这样您就可以知道哪些行已插入到TARGET,或者您有风险将行插入到SOURCE之后 INSERT,但 之前 DELETE... 具有预期的结果。尽管如此,请不要忽视 SP 无需尝试仍能以可接受的方式执行的可能性。

标签: sql stored-procedures db2 batch-processing


【解决方案1】:

如果我正确理解您的问题,并且这些都是更新,您可以创建一个 TRIGGER 将旧行放入审核表中(不过,您可以定义触发器的不仅仅是 UPDATEs . INSERTDELETE 也是可触发的)。比如:

CREATE TRIGGER AUDIT_SOURCE
 AFTER UPDATE ON SOURCE
 REFERENCING OLD AS O
 FOR EACH ROW
 BEGIN ATOMIC
   INSERT INTO TARGET
     VALUES (O.Col1, O.Col2, ..., O.ColN);
 END

【讨论】:

  • 这不是审计表,而是某种历史表。我必须从源中删除行。但就在删除它们之前,我必须将它们的更新版本插入历史表中。
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 2018-09-27
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多