使用SqlBulkCopy填充一個非常大的表的最佳方法是什麼?

.net c# sqlbulkcopy sql-server vb.net

每晚,我需要從擁有超過800萬條記錄的ODBC源填充SQL Server 2005表。目前我正在使用鏈接服務器的insert語句,其語法選擇類似於:

Insert Into SQLStagingTable from Select * from OpenQuery(ODBCSource, 'Select * from SourceTable')

這實在是效率低下,需要花費數小時才能運行。我正在使用類似於此問題中的代碼的SqlBulkInsert代碼編寫解決方案。

該問題中的代碼首先在內存中填充數據表,然後將該數據表傳遞給SqlBulkInserts WriteToServer方法。

如果填充的數據表使用的內存多於運行的計算機上可用的內存(在我的情況下,內存為16GB的服務器),我該怎麼辦?

我想過使用重載的ODBCDataAdapter 填充方法,它允許你只填充從x到n的記錄(其中x是起始索引,n是要填充的記錄數)。然而,這可能會比我現在的解決方案更慢,因為它意味著要多次在源上重新運行select語句。

我該怎麼辦?只需立即填充整個內容,讓操作系統管理內存?我應該把它裝進大塊嗎?還有其他我沒有想過的解決方案嗎?

一般承認的答案

最簡單的方法是對您的odbc數據源使用ExecuteReader()並將IDataReader傳遞給WriteToServer(IDataReader)重載。

大多數數據讀取器實現只會將總結果的很小一部分保留在內存中。


熱門答案

SSIS表現良好,非常可調。根據我的經驗,800萬行並沒有超出其聯盟。我的一個較大的ETL每天吸引2400萬行,並進行重大轉換和維度數據倉庫操作。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow