2

ソース テーブルとターゲット テーブルの両方をクエリし、完全外部結合マージ結合を実行し、条件付き分割を使用して違いを検出し、それに応じて挿入/更新/削除する SSIS パッケージがあります。これは約 80 のテーブルに対して行われ、ほとんどの場合、プロセスは正常に完了します。ただし、最近、クエリのブロックが原因でジョブがハングするという問題がいくつかありました。

ターゲット データ ソースが既存のデータの取得を完了する前に、データがターゲット テーブルに一括挿入されると、プロセスがハングします。

データが挿入される前に、既存のデータがクエリされるまでプロセスを待機させる方法はありますか。または、テーブルの読み取り中にターゲットテーブルにデータを挿入することを処理するためのより良い戦略はありますか?

4

1 に答える 1

1

これらの一連の作業を行った後、よりパフォーマンスの高い、より複雑なパターンに移行しました。他の人は別の方法で行うかもしれませんが、これは私にとってはうまくいきます。

まず、マージ結合の代わりにルックアップ変換を使用します。フル キャッシュ (既定) に設定されている参照変換は、データ フローが実行される前にデータを完全に読み込みます。これにより、挿入が識別され、迅速に更新されます。挿入はこのデータ フローから直接実行できますが、更新については...

データ フローの一部として更新を行う唯一の現実的な方法は、OLEDB コマンド変換を使用することです。これらは非常に遅いことで知られています。代わりに、すべてのデータ更新をデータ フローの一時キャッシュ テーブルに書き込み、その後、対象テーブルのレコードをキャッシュ テーブルから更新する SQL 実行項目を制御フローに追加します。

Execute SQL 項目でキャッシュ テーブルを切り捨てることを忘れないでください。

最後に、ターゲット テーブルからの選択とソース テーブルに対するルックアップ変換を使用して、データ フローで削除を識別します。再度、キャッシュ テーブルに書き込み、バッチ SQL 実行コマンドですべて削除します。

これで、私の制御フローには、キャッシュ テーブルを切り捨てるための Execute SQL、挿入と更新をキャッシュするためのデータ フロー、更新を実行するための Execute SQL、削除をキャッシュするためのデータ フロー、および削除を実行するための Execute SQL が含まれるようになりました。パッケージが複数のソース テーブルで機能する場合は、通常、各ターゲット テーブルのすべての制御フロー項目をシーケンス コンテナーに入れます。必須ではありませんが、論理構造を理解するのに役立ちます。

于 2013-08-07T21:33:10.573 に答える