2017-02-17 11 views
0

ソースとデスティネーション間でデータを1台のサーバーから別のサーバーに転送するシンプルなSSISパッケージがあります。別のLOOKUP変換を追加するとパフォーマンスが大幅に低下する理由SSIS

新しいレコードが挿入されている場合はそれが挿入され、それ以外の場合はHashByteValueカラムがチェックされ、更新レコードが異なる場合はチェックされます。

テーブルには約150万行が含まれ、約50列が更新されます。

パッケージのデバッグを開始すると、約2分間何も起こらず、緑色のチェックマークが表示されます。その後、私はデータが流れ始めるのを見ることができますが、時には停止し、再び流れて、再び止まります。

全体のパッケージは、次のようになります。

enter image description here

しかし、私は(更新なし)だけINSERT一部をすれば、それは1分と先テーブル内のすべての150万件のレコードを、完璧に動作します。

enter image description here

だから、レコードを更新したパッケージに別のLOOKUPの変換を追加するので、パフォーマンスが大幅に遅くなる理由。 メモリとは何か?私はlookupsの両方でFULL CACHEオプションを使用しています。

パフォーマンスを向上させる方法は何ですか?

は理由が自動成長のファイルサイズにすることができ:

enter image description here

+0

疑いで、トレース! – ajeh

+0

データとログの自動増加を100MBに増やし、それが役立つかどうか確認してください。1MBは小さすぎます。まれにAutogrowthにデフォルトの10%を使用することはまれです。 –

+0

投稿を編集しました。あなたはデータベースの自動成長を見ることができます。ありがとう – Oleg

答えて

2

AutoGrowthのサイズを100MBに変更するだけでなく、データベースログファイルは29GBになります。つまり、トランザクションログバックアップを実行していない可能性が最も高いです。

夜間または定期的にフルバックアップのみを実行します。データベースの回復モデルをフルからシンプルに変更します。

データベースのプロパティ]> [オプション]> [

復旧モデル

次に、あなたのログが使用して100メガバイトまでファイルを縮小します。

DBCC SHRINKFILE(Catalytic_Log, 100) 
+0

あなたは正しいです。この新しいインスタンスを別のサーバーに作成しましたが、実際にすべてを正しく設定する方法はわかりません。ありがとう – Oleg

+0

私は上に編集して、シンプルに設定してログファイルを縮小する方法を示しています。 –

+0

かなりずっとずっとずっと良い!!!! データフローを開始する前にまだ少し待っていますが、すべてが2分未満で完了しました!! ありがとうございました! – Oleg

2

私はあなたの問題は、ルックアップしているとは思いません。 OLE DBコマンドはSSISでは非常に遅いので、大量の行を更新する意味はないと思います。 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4f1a62e2-50c7-4d22-9ce9-a9b3d12fd7ce/improve-data-load-perfomance-in-oledb-command?forum=sqlintegrationservices

エラーがルックアップではないことを確認するには、「OLE DBコマンド」を無効にしてプロセスを再実行し、時間がかかることを確認してください。

私の個人的な経験では、特定の条件に基づいて更新または挿入する必要があるときに、「データフロー」全体を実行するためにストアドプロシージャを作成する方が常に優れています。そのためには、StagingテーブルとDestinationテーブル(変換されたデータをロードする場所)が必要です。

希望します。

+1

**私はこの回答がなぜ投票不能になったのか分かりません - 実際に質問に答えました** Gordon Bellによるバックアップ応答(完全に真実)は正接です。 OLEDB cmdは、行単位の挿入、oledb宛先を実行し、高速ロードに設定すると、比較的高速の「バルク」ロードが実行されます。 cmdの代わりに、asemprini87が推奨するようにして、更新行をステージング表に指示してから、procを呼び出して更新を実行します。 –

+0

私が間違っている場合は私を修正してください...私はソーステーブルと宛先テーブルがあります。あなたが言っているのは、IDにマッチした行を3番目の(ステージング)テーブルにリダイレクトする必要があるということです。その後、SPを使用して更新しますか? – Oleg

+1

通常、ETLプロセスでは、問合せをデータ・ソースに投げて結果をステージング表に入れる標準が使用されます。ステージでデータを取得したら、変換プロセスを実行してデータウェアハウスに配置します。このステップでは、この挿入と更新を行うSPが必要です。我々は、この目的のために大きなプロセスでステージングテーブルを使用します:https://en.wikipedia.org/wiki/Staging_(data) – asemprini87

関連する問題