2013-10-15 18 views
5

付属のとおり、約200万行のデータ変換でバランス型データディストリビュータを設定しています。スクリプトのタスクは同じです。それぞれがOracleへの接続を開き、最初に削除と挿入を実行します。 (これは関係ありませんが、それは...原因OLE DBコマンドとOracleのMicrosoft OLE DBプロバイダとのパラメータの問題のためにそのように行うの)SSIS平衡データディストリビュータ - 操作回数を増やす?

enter image description here

私はに実行している問題は無いです私がバッファをどれくらい大きくしているのか、何回並行して実行するかによって、一度に5つ以上の同時プロセスは実行されません。

私は大きなバッファで数十万行を引き戻しました。それはちょうど5つの方法で分割されています。私はこれを複数のマシンで試しました。現在のショットは16コアサーバーからのもので、パッケージに-1同時実行が設定されています。何があっても、常に5つの並列ジョブです。

5は1よりも優れていますが、挿入/更新する行数が250万の場合、5回の同時実行で15個の行が1回の同時実行で2〜3個の行に比べてあまり良くありません。

さらに多くのパスを使用するようにBDDを強制できますか?

+0

から有効なBDDはまだケースを使用して持っていなかったが、あなたはOracleでステージング表にまっすぐに不活性であるためにあなたのパターンを変更することができるだろうとExecute SQLタスクを使用してデータフローが完了した後、削除と挿入を実行しますか? – billinkc

+0

それは疑問点ですが、元のパターンは完全に削除され再作成されました。挿入部分(削除なし)は、シングルスレッド実行時に4日間かかりました。 SSISでのOracle接続の使用は非常に遅いです。この特定のプロセスは今よりはるかにインテリジェントであり、アップデートはたった数百行にすぎません。この問題はBDDに重点を置いています。将来、これらのタイプのプロセスをさらに増やす予定であり、パフォーマンスのチューニングがより必要になるからです。 –

+1

これは私が知らなかった興味深いコンポーネントのように見えたので、私はDebarchan Sarkarのイントロビデオを見ました。彼は「最高5つの流れで最高に機能する」と言いましたが、それが限界であるとは言いませんでした。 http://technet.microsoft.com/en-us/sqlserver/hh369962.aspx – Metaphor

答えて

4

短い回答:

はいBDDは5つ以上のパスを使用できます。あなたはそれを強制するために何か特別なことをしてはいけません、それは自動的にあなたのためにそれを行う必要があります。それで、なぜ5つ以上のパスを使用していないのですか?ソースがデータを生成する速度が目標よりも速いため、バックプレッシャが発生します。これを解決するには、ターゲットコンポーネントを調整する必要があります。

長い答え:理論的には

、「BDDがありますが、多くの出力、だそれに等しい割合でその入力データとルートを取ります。」あなたのセットアップでは、10の出力があります。したがって、入力データは同時に10個の出力すべてに均等に分配されなければならず、同時に理論上は10個のパスが同時に実行されるはずです。

BDDの別の概念は、「個々の行をルーティングするのではなく、データのバッファで動作します」ということです。これは、データフローエンジンがバッファを開始し、できるだけ多くの行でバッファを満たし、そのバッファを次のコンポーネント(あなたの場合はスクリプトのデスティネーション)に移動することを意味します。ご覧のように、同じ数の行を持つ5つのバッファが使用されています。追加のバッファーが開始された場合は、より多くのパスが使用されていることがわかりました。バックプレッシャと呼ばれるメカニズムのため、SSISは追加のバッファと最終的に追加のパスを使用できませんでした。送信元が送信先よりも速くデータを生成する場合に発生します。それが起こると、すべてのメモリがソースデータによって消費され、SSISは変換および宛先コンポーネントに使用するメモリを持ちません。そのため、SSISはアクティブバッファの数を制限します。表示されているスレッドの数とまったく同じ5(変更できません)に設定されています。

PS:引用符内のテキストは、あなたがしてthis article

+0

これを少し消化しなければならないだろうが、あなたがそれを打ったと思う。 –

1

EngineThreadsと呼ばれるSSISデータフロータスクには、同時に実行できるフローの数を決定するプロパティがあります。デフォルト値は5です(SSIS 2012ではデフォルト値は10です。 SSIS 2008またはそれ以前のバージョン)。最適値は環境に依存するため、何を置くべきかを把握するためにいくつかのテストが必要になるでしょう。

Jamie Thomson articleはもう少し詳しくです。

+0

良いアイデアです。悲しいことに、私のデータフロータスクのEngineThreadsもデフォルトで10になっています。しかし、私はそれを試して、それがどうにか変わるかどうかを見ていきます。 –

0

this article on CodeProjectで発見したもう一つの興味深いものです。

[T]は彼の成分は、9947行(私は見出さ 実験ごとなど)の内部バッファを使用し、それが予め設定されます。これを無効にする方法はありません これです。 10 lac行の代わりに、私たちは入力ファイルに9,947行だけを使用し、その動作は であることがわかります。パッケージを実行すると、すべての 行が最初の出力コンポーネントに転送され、もう1つの コンポーネントは何も受信されないことがわかります。

入力ファイルの行数を9,947から 9,948(9,980個)に増やしましょう。パッケージを実行した後、 は、第1の出力コンポーネントが9,947行を受信し、 第2の出力コンポーネントが1行を受信したことを検出します。

私は最初のバッファーランで50,000レコードを取り出したことに気付きました。それらは9,984レコードバケットに分割され、各出力に渡されました。したがって、本質的にBDDはバッファから取得したレコードを取り出し、各出力に対して〜10,000レコード増分で渡します。したがって、この場合、おそらくあなたのソースがボトルネックになります。

元のソースクエリを半分に分割し、2つのBDD駆動型データフローを作成して、本質的に並列スループットの2倍にする必要があるかもしれません。

+2

私はバッファーで遊んだ。実際にその記事は間違っています - あなたはそれを上書きすることができます。行数は、データフロータスクDefaultBufferSizeとrowsizeで割ることによって決定されます。バッファサイズを大きくすると、行セットのサイズが大きくなり、5分の1の制限も大きくなるので、バッファを2倍にすると、約100k行が引き出され、各パスに20k行が割り当てられます。 –

関連する問題