テーブルをテキストファイルにエクスポートする最速の方法は何ですか


17

SQL Server 2012データベースと、300万行、おそらく50列のテーブルがあります。無人のバックグラウンドの.netプロセス(SQLまたはPowershellコマンドを発行する可能性があります)をテキストファイルにエクスポートする最速の方法は何ですか?.netプロセスは、エクスポートがいつ完了したか、またはエラーが発生したかどうかを知る必要があります。データ型はall intまたはになりnvarcharます。

私は、ado.netを使用してselect *コマンドを実行し、データリーダーをループして各レコードのファイルに書き込む純粋なC#コードは低速であり、これを並列化する方法はないと想定しています。

エクスポートは、SQL Serverマシンのローカルフォルダーではなく、リモート共有ネットワークフォルダーに行うことが理想的です。SQL ServerはHAクラスターになります。SSISはこれに適していますか、データ変換は必要ありませんか?

.NetプロセスはマシンAで実行され、SQL ServerはマシンBで実行され、最終的なファイルの宛先はネットワーク共有です。1つのオプションは、SQLサーバーがファイルをネットワーク共有に直接書き込むことです。もう1つのオプションは、SQL ServerがマシンAに書き込み、ファイルが書き込まれると、.netプロセスがそれをネットワーク共有にコピーすることです。正式なSLAはありませんが、ファイルの書き込みに30分から1時間かかります。


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."-.NETアプリはどこから実行されますか?最悪の場合、これはデータが2つのネットワークホップを移動する必要があることを意味し、おそらく最大のボトルネックになります。また、行の数はいくぶん無関係です-おおよその合計データサイズはどれくらいですか?このプロセスのために満たす必要があるパフォーマンスSLAはありますか?
ジョンセイゲル

回答:


10

古い記事を実行したい場合は、これらすべての記事をループするオプションがあります。

あなたが試すべきいくつかの異なるオプションは次のとおりです。

そして、楽しみのために、別のセッションでループしながらこれらすべてのオプションを試すことができます:-)。


4

インポートエクスポートウィザードを使用するだけです。最後に、タスクを保存するオプションが表示されます。これは、SQL Serverエージェントでスケジュールできます。自分をオペレータとして追加し、サーバー上でDBメールを設定すると、ジョブが完了または失敗したときにメールを送信できます。

真剣に、なぜ車輪を再発明するのですか?

http://msdn.microsoft.com/en-us/library/ms140052.aspx


悪くはありませんが、実際にはこれによりSSISパッケージが最後に保存されます。1回限りのタスクである場合は、解決策になります。
マリアン

2

他の人は、bcpが最速の方法であるべきだと述べていますが、CLRソリューションに勝る利点は見当たりません。データベーステーブルへの挿入では、さまざまな一括コピーの実装が常に優先されます。これは主に、ロギングを最小化し、マルチスレッド書き込みを有効にする方法によるものです。フラットファイルに書き込む場合、これらの制約はありません。

私の仕事では、CLRを使用してクエリ出力をファイルにダンプします。また、作成後にファイルを自動的に圧縮できるように、Ionic.Zip.dllを組み込みます。

以下は、opがblobのbcpの2倍の速度であると主張する例です:https : //stackoverflow.com/questions/10325338/fastest-way-to-export-blobs-from-table-into-individual-files


その特定の質問はあまり詳しくありません。次の質問-BLOBデータのBCPパフォーマンスの最適化をここで読むことをお勧めします。BCPのみで使用できる多くの再生オプションについてのアイデアが得られます:-)。
マリアン

リンクを確認し、完全に同意します。ただし、最適化ポイントのほとんどは、データをSQLサーバーにロードするためのものです。SQLデータをフラットファイルに書き込むときに、bcpがストリームライターまたはファイルストリームCLRソリューションよりも高速であることに関連する事実を見たことはありません。
ブライアン

1

簡単なSSISパッケージを作成できます。

高レベルの方法は次のとおりです。

  1. 接続マネージャーでデータベースへのOLEDB接続を作成します
  2. データフロー変換をコントロールフローにドラッグし、それをクリックしてデータフローに移動します。
  3. OLEDBソースをツールボックスからデータフローにドラッグし、手順1で作成した接続を使用して目的のテーブルに接続するように編集します。
  4. フラットファイルの宛先をツールボックスからデータフローにドラッグし、OLEDBソースをそれに接続します。
  5. フラットファイルの保存先で[新規]を選択すると、同じ列構造を持つ新しいフラットファイルが作成されます。必要に応じて、必要な区切り文字または固定ファイルを使用できます。
  6. それを実行します。

どのnoobでもこれを理解できるはずです。アンチGUIの人はこのソリューションを好まないので、その点に関するコメントを保存してください。これは、BCPの使用に苦労している、技術に詳しくない個人向けの代替手段にすぎません...

データファイルのフォーマット方法にもう少し柔軟性があります。これはBCPなどで行うことができますが、これにより複雑さがなくなります。ただし、カスタムファイルヘッダーを挿入し、最初の行として "列名"を作成できるため、フラットファイルがより人間に使いやすくなるという小さな利点があります。

保存することを忘れないでください。一度作成した場合は、再度尋ねられるでしょう。お役に立てれば..


0

コマンドラインからのbcp.exeが最も速い方法だと思います。

http://msdn.microsoft.com/en-us/library/ms162802.aspx


5
あなたは正しいかもしれませんが、この解決策の詳細に光を当てることはできますか?どのように使用されるか(ドキュメントへのリンクで十分かもしれません)、なぜそれが高速であると思うのでしょうか?
-dezso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.