1

SSISを使用してアップサート操作を実装しています

一般的なパッケージ構造は次のとおりです。

<Begin transaction>

<read config values>

<Data flow task>

<commit transaction>

データフロータスクは、

<oledb Source>

<Lookup>

<matched output to Update using oledbcommand>

<No Match output to Insert using oledbcommand>

インサートしかない場合、パッケージは最初は正常に動作します

2回目の実行で、一連の更新が発生し、その後挿入が発生すると、Updateステートメントは宛先テーブルで排他ロックを保持し、でスリープ状態AWAITING COMMANDになり、Insertは一時停止され、ロックを待機し続けます。 。

最後のパラグラフのステートメントを確認するために、次のコマンドを使用しました。

select * from master.sys.sysprocesses where blocked<>0 or spid in (select blocked from master.sys.sysprocesses where blocked <>0)

このロック状態を修正する方法はありますか?

4

2 に答える 2

4

トランザクションを明示的に制御しているので、RetainSameConnectionプロパティをtrueに設定しましたか?そうしないと、同じリソースへの2つ以上のデータベース接続があり、同じテーブルを挿入および更新しますが、トランザクションが異なるため、発生する動作が発生します。

于 2013-02-05T15:53:36.580 に答える
3

OLEDBコマンドには問題があることが知られています。カーソルと同様に、一度に1行ずつ実行されます。そのため、特に処理するレコードが多数ある場合は時間がかかります。ロックが発生する理由を正確に言うことはできませんが、他のプロセスが同時にテーブルにアクセスしようとしていることが原因だと思います。

データフロータスクを次のようなものに変更することをお勧めします。

oledbソース

見上げる

OLEDB Destinationに一致する出力がありません。宛先を直接追加します。ここで、挿入を行うためにOLEDBコマンドは必要ありません。

一致したレコードを宛先データベースのステージングテーブルに転送します

制御フローで、SQL実行タスクと更新ステートメントを使用して更新を実行します。これにより、セットベースの更新が実行されます。元の構成よりも高速です。

SQL Server Centralに関するこの記事では、実装について説明します。2005を使用していることに注意してください。スイート2008へのルックアップ変換に小さな変更を加える必要があります。

于 2013-02-05T15:44:57.293 に答える