2012-04-27 10 views
0

私は2つのテーブルTARGETとSOURCEを持っています。 私はSOURCEテーブルの行を更新し、それらの更新された行をTARGETテーブルに挿入し、元の行をSOURCEから削除する必要があります。 現在、私はSOURCEテーブルをSPで完全に更新してから、別のSPでMove操作を行っています。削除+挿入(移動)DB2 OLD TABLE

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では動作しませんでした。

私はこれが一般的なシナリオだと思います。 History/Archive Tableを参照してください。DB2にはソリューションが必要です。パフォーマンスに影響を与えることなくこれを達成するにはどうすればいいのですか?私は、SPの実行に長時間を要さないことを意味します。また、冗長アップデートSPを削除することもできます。代わりに、更新された行をTARGETに直接挿入し、対応する行をSOURCEから削除できますか?また、削除と挿入操作を単一のトランザクションで行うことをお勧めしました。それはパフォーマンスの損失を引き起こすでしょうか?

+0

トランザクションのパフォーマンスは常に高くなります。期間。そして、はい、この**必要性**は取引にあるか、あるいはあなたはひどい危険を冒します。また、現在の「ムーブ」SPは、取引中であっても「安全に」行動しませんのでご注意ください。私は確かにもっと知る必要があるのではないかと心配していますが、中間テーブルを使わずに 'Target'を直接更新することはおそらく可能です。 –

+0

はい更新された行を挿入し、古い行を冗長更新せずに古い行を削除します。マージを使用している現在のアップデートspは、古いテーブルを更新する時間が短いので、spで単一行の挿入と削除操作を導入することでパフォーマンスを落としたくありません。だから私は目標テーブルのバッチ更新と対応する古いテーブルからの削除を維持する何かを探しています – techknowfreak

+0

どのようなタイプの列は 'col'であり、それは一意でなければならないのですか?一意にならない場合は、何らかのフラグ値を使用する必要があるので、 'TARGET'にどの行が挿入されたのかを知ることができます。あるいは、' INSERT'の後に行を 'SOURCE'に挿入する危険性があります。 'DELETE' ...を予期した結果と比較します。ただし、SPが試行せずに許容範囲内で実行できる可能性はありません。 –

答えて

1

私が正しくあなたの質問を理解していて、これらはすべての更新されている場合は、監査テーブルに古い行を入れてTRIGGERを作成することができますが(ただし、それはあなたのためのトリガーを定義することができるだけでUPDATEのではありません。INSERTDELETEもトリガ可能です)。次のようなものがあります。

+0

これは監査テーブルではなく、履歴テーブルの並べ替えです。私はソースから行を削除する必要があります。しかしそれらを削除する直前に、それらの更新版を履歴表に挿入する必要があります。 – techknowfreak