【发布时间】: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