非常に大きなSQL Server 2016結果セット(75 GBを超える)をCSVファイルに取得する最良の方法は何ですか?エンジニアは、相関を探すためにこの出力を必要とします。
73.5 GBファイルのbcp
ルートがtempdbをいっぱいにして、ETLプロセスを含む他のアプリケーションのクラッシュを開始しました。
ユーザーは最大500 GBをエクスポートしたいと考えています。
他のアプリケーションが実行し続けるために、どのプロセスが最小のリソースを使用しますか?
私も、大きな結果セット(7〜8 GB)を区切りファイルにエクスポートするときに問題が発生していました。 SQLCMDもBCPもSSISも、動的な結果セット、動的なテキスト修飾、列ヘッダー行の追加などを処理できませんでした。そのため、これを処理するための独自のツールを構築しました。現在はDB_BulkExportストアドプロシージャとして SQL# SQLCLRライブラリ(私が書いた)に保存されていますが、計画はスタンドアロンのエクスポートユーティリティに分割し、機能を拡張します。
DB_BulkExportストアドプロシージャは、フル(有料)バージョンのSQL#(つまり、無料バージョンではない)でのみ使用できますが、私はこの種のことをするための無料のユーティリティを知りません(それで私が自分で書いた理由)。
大きな結果セットのエクスポートに関して:結果セットから読み取られるときに各行をファイルに書き込むため、これまでのところメモリの問題は発生していません。
構造/スキーマの点で実際には変更されない単一のテーブル/クエリに対してのみこのエクスポートが必要な場合は、.NETまたはPowerShellのいずれかで、小さな専用アプリを自分で作成するのが最善の方法です。トリッキーな部分は、動的要件の処理です。ただし、列の名前やデータ型などがわかっている場合は、出力ファイルを開いてクエリを実行し、SqlDataReader
のすべての行についてString.Concat
必要な場合はテキスト修飾を含み、必要な場合は適切なフォーマット指定子(つまり、日付(時刻)の値)を適用することを含め、すべてを組み合わせます。
PowerShellが適切に機能する場合があります。
Invoke-Sqlcmd -ServerInstance $SQLServer -Database $DBName -Query $ExportSQL | Export-CSV -Path $ExportFile -NoTypeInformation
Invoke-Sqlcmdは、MicrosoftのSqlServer
モジュールに含まれています(Install-Module sqlserver
)。
私は確信が持てませんが、Invoke-SqlCmdがデータをストリーミングし、メモリを使用しないExecuteReaderを使用すると想定します。
以前のバージョンのPowerShellは過度にログ記録されたCSV関数なので、新しいバージョンで試してください。