SSISまたはマルチスレッドC#アプリケーションを使用して、フラットファイルをデータベースに読み込む必要がありますか?
-
02-07-2019 - |
質問
SQL Server Integration Services(SSIS)内には、数百万のレコードを保持し、そのデータをSQL DBにプッシュできるフラットファイルへの接続をセットアップする機能があります。さらに、このプロセスは、Microsoft.SqlServer.Dts.Runtime名前空間を参照して使用することにより、C#アプリから呼び出すことができます。
何百万ものレコードを含むフラットファイルをSSISで実行するのが最善でしょうか、それとも「あなた」という集団が複数のワーカースレッド(1つは変数に行を追加し、1つはその変数からDBに書き込む)、および「mother」というc#アプリを好むそれらのスレッドを管理するクラス? (開発ボックスには2つのCPUがあります)
このデータ( SQLチームブログ)を見て、 100万行のフラットファイル、SSISは最速です:
Process Duration (ms)
-------------------- -------------
SSIS - FastParse ON 7322 ms
SSIS - FastParse OFF 8387 ms
Bulk Insert 10534 ms
OpenRowset 10687 ms
BCP 14922 ms
あなたの考えは?
解決
私は自分自身と自分の経験についてのみ話すことができます。これは、SSISを使用します。これは、不必要にホイールを再発明する可能性があるケースの1つだからです。これは、SSISによって既に解決されている反復的なタスクです。
私は毎日約57件の仕事(DTSとSSISの組み合わせ)を管理しています。それらのうち4つは、500〜1億件のレコードのエクスポートを定期的に処理します。私が管理するデータベースには、約20億行あります。スクリプトタスクを使用して、1日に数回ジョブを実行できるように、ミリ秒単位の日付を追加しました。約22か月間それをやっています。素晴らしかった!
SSISジョブもスケジュールできます。したがって、設定して忘れることができます。私は毎日すべてを監視していますが、ファイル処理部分は故障していません。
カスタムC#プログラムに頼らなければならなかったのは、非常に大きなファイルを小さなチャンクに分割する必要があるときだけでした。 SSISは、この種の処理には時間がかかります。スクリプトタスクを使用して、1ギグのテキストファイルを分割するのに約1時間かかりました。 C#カスタムプログラムは、12分でそれを処理しました。
最終的には、使いやすいと感じるものを使用してください。
他のヒント
SSISは非常に高速です。さらに、繰り返し発生する必要がある場合は、スケジュールに従ってエージェントを起動するようにセットアップできます。自分で書くことは一つのことです。マルチスレッドにしようとすると、最初に現れるよりもずっと複雑になります。
SSISを10回のうち9回推奨します。
この場合、複数のスレッドを使用するとパフォーマンスがどのように向上するかわかりません。大量のデータを転送する場合、主なボトルネックは通常、ディスクI / Oです。複数のスレッドを生成してもこの問題は解決しません。データベースにアクセスする複数のプロセス間でロック競合が発生するため、事態はさらに悪化すると推測します。