簡體   English   中英

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

[英]What's the best way to use SqlBulkCopy to fill a really large table?

每晚,我需要從ODBC源中填充超過800萬條記錄來填充SQL Server 2005表。 目前,我正在從鏈接服務器使用插入語句,其語法選擇類似於以下內容:

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

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

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

如果填充的數據表使用的內存多於正在運行的計算機上的可用內存(我的服務器具有16GB內存),該怎么辦?

我考慮過使用過載的ODBCDataAdapter fill方法,該方法只允許您填充x到n的記錄(其中x是起始索引,n是要填充的記錄數)。 但是,這可能比我目前的解決方案還要慢,因為這將意味着在源上重新運行select語句多次。

我該怎么辦? 只需一次填充整個內容,然后讓OS管理內存? 我應該分塊填充嗎? 還有我沒想到的其他解決方案嗎?

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

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

SSIS表現良好,並且非常可調整。 以我的經驗,有800萬行並不是沒有競爭對手。 我的一個較大的ETL每天要吸引2400萬行,並進行重大轉換和維數據倉庫操作。

如果目標表上有索引,則可以考慮禁用這些索引,直到插入記錄?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM