web-dev-qa-db-ja.com

SSISでのデータフローの一部の行の複製

古いデータベースから新しいデータベースにデータを移行するためのデータフローがあります。古いデザインでは、すべてのデータと履歴情報(変更)が単一のテーブルに格納され、その行に対する「バージョン」(整数の増分)が設定されていました。

新しいデザインには2つのテーブルがあり、1つはデータの「現在の」状態用で、もう1つはトリガーを使用して変更を記録する監査(または履歴)テーブルです。したがって、「現在の」データには1つの行しか存在せず、多くの履歴行があります。

私のSSISパッケージでは、次のコンポーネントを使用して現在のデータを1つのテーブルにコピーしていますが、すべてのデータを監査テーブルに送信しています。

SSIS data flow

マルチキャストはデータのストリームを分割するために使用され、条件付き分割は「現在の」行を識別し、それをOrderテーブルに送信します(テーブルは実際には呼び出されませんOrder、誰よりも前にテーブル名に予約語を使用することに関するコメント)。

条件付き分割を使用してallデータをAudit宛先に送信し、現在の行のみを他の宛先に送信する方法がわからなかったため、このフローを作成しました。

すべての重複データを作成してからそれをゴミ箱の宛先に廃棄することはあまり効率的ではないと想定しています。移行する行が約52百万あるため、変換に数日かかるのではないかと心配しています。

データ分割を実現するより良い(より効率的な)方法はありますか?

データに関する注意:「現在の」行を番号1として識別できるように、データにrow_number()を適用しました「現在」を含むすべての行は、監査テーブルの宛先に移動する必要があります。

編集:このSSIS Junkieのブログ投稿で提案されているマルチキャストと条件付きスプリットの代替案を見つけました: 同期スクリプトからの複数の出力変換

スクリプトコンポーネントを使用して、1つ以上の出力にデータを送信します。私はそれがより速いかどうかを確認するためにその方法を試していますが、ゴミ箱の宛先を削除することについてのケネスの回答と提案を見た後、それが確実かどうかはわかりません。

7
Tony

そのデータフローには明白な問題はありません。私は常にソースクエリでできるだけ多くの作業を行うことをお勧めします。そのため、単純な分割を介して両方のテーブルにデータを入力できるデータセットを最初に作成できれば、メモリ使用量は確実に少なくなります。しかし、データソースとデータ形式によっては、このようなことが常に可能とは限りません。

また、ゴミ箱の宛先は開発/デバッグには適していますが、本番環境には適していません。それを除く。分割時に「不要なデータ」の有効期限が切れます。 SSISは残りの部分を理解できます。

コンポーネント(UNION、MERGEなど)のブロックを回避する限り、このプロセスに数日かかる理由はありません。 SSISでは何百万もの行を問題なく頻繁に処理しています。 SSISは、プロセスを設計した人と同じくらい遅いだけです。

現在、パフォーマンスの問題がありますか?

3
Kenneth