3

SSIS を使用して 2 つのデータベース間でデータを同期しています。私は過去に SSIS と DTS を使用したことがありますが、通常はこの性質のアプリケーションを作成します (私はコーダーであり、そのほうが簡単です)。

私のパッケージでは、約 15,000 行を返す SQL タスクを使用しています。これを Foreach コンテナーに接続し、その中で結果セットの列の値を変数に割り当て、それらの変数を別の SQL タスクに供給されるパラメーターにマップします。

私が抱えている問題はデバッグに関するものであり、ブレークポイントや実行時の値の評価などのより複雑なデバッグだけではありません。つまり、これをデバッグなしではなく実行すると、完了するまでに数時間かかるということです。最終的に Delphi でプロセスを書き直した結果、次のようになりました。

データのフル プッシュ:
15,000 行をプルし、各行の宛先テーブルを更新してから、11,000 行をプルし、各行の宛先テーブルを更新します。

デバッグ:
Delphi アプリ: 139 秒
SSIS: 4 時間 46 分

デバッグなし:
Delphi アプリ
: 132 秒 SSIS: 384 秒

データの更新:
これにより 3,000 行がプルされますが、更新は必要なく、宛先テーブルに対しても行われません。次に、11,000 行をプルしますが、ここでも更新は必要なく、宛先テーブルに対しても行われません。

デバッグ:
Delphi アプリ: 42
秒 SSIS: 1 時間 10 分

デバッグなし:
Delphi アプリ: 34 秒
SSIS: 205 秒

奇妙なことに、このデバッグに費やされる時間のほとんどは、Visual Studio の UI 要素を更新することだけに費やされているように感じます。進行状況タブを見ると、各反復 (合計数千回) ごとにノードがツリーに追加され、プロセスが進行するにつれて、これはますます遅くなります。Visual Studio が UI を更新するループに巻き込まれているように見えるため、通常、デバッグを停止しようとしてもうまくいきません。SQL Server のプロファイラーを確認すると、実際の作業は行われていません。マシンが重要かどうかはわかりませんが、仕事には十分すぎるはずです (クアッド コア、4 ギガの RAM、512 MB のビデオ カード)。

この種の行動は正常ですか?私が本業のコーダーであると述べたように、私はこの種のアプリを書くことに何の問題もありません (実際、SSIS でアプリケーションを「描画」するよりも、アプリケーションをコーディングするのにかかる時間ははるかに短くなりますが、私はSSIS でより多くの作業を行うとマージンが縮小すると考えてください)、しかし、SSIS や DTS のようなものが私のツールボックスに収まる場所を見つけようとしています。これまでのところ、それについて本当に私を感動させたものは何もありません。何らかの方法で SSIS を誤用または悪用している可能性がありますか?

どんな助けでも大歓迎です、事前に感謝します!

4

3 に答える 3

3

SSIS は、そのような foreach を実行するようには設計されていません。入ってくる行ごとに何かをしている場合、おそらくそれらをデータフローに読み込み、ルックアップまたはマージ結合を使用して、INSERT (これらは一括で発生します) または複数の SQL UPDATE のデータベース コマンド オブジェクトを実行するかどうかを決定します。コマンド (より効率的なオプションは、これらをステージング テーブルにバッチ処理し、単一の UPDATE を実行することです)。

別の典型的な同期状況では、すべてのデータをステージング テーブルに読み取り、既存の行に対して SQL Server UPDATE を実行し (INNER JOIN)、新しい行に対して INSERT を実行します (LEFT JOIN、rhs IS NULL)。リンクされたサーバーを使用する可能性もありますが、すべての (または多くの) データがネットワークを経由する必要がある可能性があるため、接続が遅くなる可能性があります。

データ変換と検証の処理、TableDifference コンポーネントを使用したゆっくりと変化するディメンションを含む、2,400 万行を定期的にインポートする SSIS パッケージがあります。これは、別のクライアント プログラムと比較して、その大量のデータに対して比較的迅速に実行されます。

于 2008-11-01T01:41:20.003 に答える
3

SSIS の制御フローとループはパフォーマンスが高くなく、このような量のデータを処理するようには設計されていません。特にデバッグ中 (各タスクの実行前後) に、デバッガーはデザイナー プロセスに通知を送信します。デザイナー プロセスは形状の色を更新しますが、これは遅くなる可能性があります。

データフローを使用すると、パフォーマンスが大幅に向上します。データ フローは単一の行では動作せず、行のバッファーで動作します。はるかに高速であり、デバッガーはバッファーの開始/終了についてのみ通知されるため、その影響はあまり目立ちません。

于 2008-10-31T16:14:34.797 に答える
0

私はこれが動作であることに気付きました.移動用のSSISパッケージがあり、300万エントリ近くのどこかで実行され、約3〜4日間実行されるため、デバッグできませんでした.

SSIS は今でも私が行った方法です。SSIS で「デバッグ」するのではなく、完全なデータセットを操作するときに実行します。デバッグが必要な場合は、非常に小さなデータセットを使用します。

于 2008-10-31T15:09:44.977 に答える