SQL Server 2012データベースと、300万行、おそらく50列のテーブルを用意します。無人バックグラウンド.netプロセス(SQLまたはPowershellコマンドを発行する可能性があります)をデータファイルの各行に1行ずつテキストファイルにエクスポートする最も速い方法は何ですか? .netプロセスは、エクスポートがいつ終了したか、またはエラーが発生したかどうかを知る必要があります。データ型はすべてint
またはnvarchar
です。
Ado.netを使用してselect *
コマンドを実行し、datareaderをループして各レコードのファイルに書き込む純粋なC#コードは遅くなり、これを並列化する方法はないと想定しています。
エクスポートは、SQL Serverマシンのローカルフォルダーではなく、リモート共有ネットワークフォルダーにエクスポートするのが理想的です。 SQL ServerはHAクラスターになります。 SSISはこれに適していますか?データ変換は必要ありませんか?
.NetプロセスはマシンAで実行され、SQL ServerはマシンBで実行され、最終的なファイルの宛先はネットワーク共有です。 1つのオプションは、SQLサーバーがファイルをネットワーク共有に直接書き込むことです。もう1つのオプションは、SQL ServerがマシンAに書き込み、ファイルが書き込まれると、.netプロセスがそれをネットワーク共有にコピーすることです。正式なSLAはありませんが、ファイルの書き込みに30分から1時間かかると予想しています。
これらの記事をすべてループすることは、古くなりたいのであれば、その実行を監視するオプションです。
試してみる必要があるいくつかの異なるオプションは次のとおりです。
そして、楽しみのために、別のセッションでループしながらこれらすべてのオプションを試すことができます:-)。
インポートエクスポートウィザードを使用するだけです。最後に、タスクを保存するオプションが表示され、SQL Serverエージェントでスケジュールすることができます。自分をオペレーターとして追加し、サーバーでDBメールを構成すると、ジョブが完了または失敗したときにメールで通知されます。
真剣に、なぜ車輪を再発明するのですか?
他の人はbcpが最速の方法であるべきだと述べましたが、CLRソリューションに勝る利点はありません。データベーステーブルへの挿入では、さまざまな一括コピーの実装が常に優先されます。これは主に、ロギングを最小限に抑え、マルチスレッド書き込みを有効にする方法が原因です。フラットファイルに書き込む場合、これらの制約はありません。
私の仕事では、CLRを使用してクエリ出力をファイルにダンプします。 Ionic.Zip.dll も組み込んでいるため、作成後にファイルを自動的に圧縮できます。
これは、opがblobのbcpの2倍の速さであると主張する例です: -ファイル
簡単なSSISパッケージを作成できます。
高レベルな方法は次のとおりです。
どのnoobもこれを理解できるはずです。反GUI担当者はこのソリューションを望まないので、その点についてのコメントを保存してください。これは、BCPの使用に苦労している、技術にあまり詳しくない個人のための代替手段にすぎません...
データファイルのフォーマット方法には、もう少し柔軟性があります。 BCPなどでこれを行うことができますが、これにより複雑さが解消されます。ただし、カスタムファイルヘッダーを挿入し、最初の行として「列名」を作成できるため、フラットファイルをより人間が使いやすいものにするという小さな利点があります。
保存することを忘れないでください。一度作成した場合は、もう一度尋ねられるでしょう!お役に立てれば..
コマンドラインのbcp.exeが最も速い方法だと思います。