非常大的 SQL Server 2016 結果集(超過 75 GB)到 CSV 文件?
將非常大的 SQL Server 2016 結果集(超過 75 GB)獲取到 CSV 文件的最佳方法是什麼?工程師需要這個輸出來尋找相關性。
一個 73.5 GB 文件的
bcp
路由填滿了 tempdb,並開始使其他應用程序崩潰,包括 ETL 程序。我們的使用者希望最多導出 500 GB。
哪個程序會使用最少的資源以使其他應用程序繼續執行?
我也曾經在將大型結果集(7 - 8 GB)導出到分隔文件時遇到問題。SQLCMD、BCP 和 SSIS 都不能處理動態結果集、動態文本限定、添加列標題行等。所以,我建構了自己的工具來處理這個問題。它目前作為SQL# SQLCLR 庫(我編寫的)中的DB_BulkExport儲存過程退出,但計劃是將其分解為獨立的導出實用程序並擴展功能。
請注意,DB_BulkExport儲存過程僅在 SQL# 的完整(付費)版本中可用(即它不在免費版本中),但我不知道有任何免費實用程序可以做這種事情(因此我為什麼我自己寫的)。
關於大型結果集的導出:到目前為止,我還沒有遇到記憶體問題,因為它會在從結果集中讀取每一行時將其寫入文件。
如果您只需要對在結構/架構方面並沒有真正改變的單個表/查詢進行此導出,那麼最好自己編寫一個小型的專用應用程序,無論是在 .NET 還是 PowerShell 中。棘手的部分是處理動態需求。
SqlDataReader
但是,如果您知道列的名稱和數據類型等,那麼打開輸出文件,執行查詢,然後將String.Concat
所有內容放在一起,包括文本限定,這應該是一件足夠簡單的事情需要並在需要時應用適當的格式說明符(即日期(時間)值)。
PowerShell 可能適合您。
Invoke-Sqlcmd -ServerInstance $SQLServer -Database $DBName -Query $ExportSQL | Export-CSV -Path $ExportFile -NoTypeInformation
Invoke-Sqlcmd 包含在
SqlServer
Microsoft (Install-Module sqlserver
) 的模組中。我不太確定,但假設 Invoke-SqlCmd 使用流數據且不使用記憶體的 ExecuteReader。
早期版本的 PowerShell 過度記錄 CSV 函式,因此請確保嘗試使用較新版本。