2016-01-07 132 views
1

我有一個包含100萬條記錄的表。我需要能夠將這些記錄移動到另一個數據庫和另一個表。SQL Server批量複製插入百萬條記錄慢

我正在使用存儲過程來獲取數據。它填充一個數據適配器,然後將數據bcp到新表中。

我們在SQL Server 2005和C#4上。我們將轉向使用C#4.6或5.0的SQL Server 2012或2014和Visual Studio 2015。如果有什麼功能可以使這項工作順利。

  • 爲10K記錄過程花費小於1秒
  • 爲500K記錄時,DataAdapter運行的內存和處理失敗。 批處理到100k記錄,select語句是SQL中返回100k個記錄的問題,每次循環需要2分鐘。

有沒有一種方法,或者有什麼問題我下面的代碼來填充保持數據適配器,而是映射列有BulkCopy住宿服務器端,只是從數據庫推記錄到新表像SSIS一樣?

看起來大容量拷貝本身閃電般快,但是適配器填充失敗,因爲它嘗試用100萬條記錄填充適配器的內存不足。沒有每次做1行,我只想在表格之間移動數據。

一個表有27列,其中5列不在表2中,列中有32列,有些列在兩個表中都沒有命名。

這是一個概念驗證(PoC)。

sourceConn_transDB.Open(); 
SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB); 
DataTable table = new DataTable(); 

sourceCommand.CommandTimeout = 600; 

using (var adapter = new SqlDataAdapter(sourceCommand)) 
{ 
    WriteLineWithTime("Adapter Fill"); 
    adapter.Fill(table); 
} 

if ((table == null) || (table.Rows.Count <= 0)) 
    break; 

using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" }) 
{ 
    bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID")); 
} 

回答

4

您是否嘗試過使用WriteToServer重載採取IDataReader,那麼你就需要使用DataTable可言。

sourceConn_transDB.Open(); 
using(SqlCommand sourceCommand = new SqlCommand(queryString, sourceConn_transDB)) 
{ 
    sourceCommand.CommandTimeout = 600; 

    using (SqlDataReader reader = sourceCommand.ExecuteReader()) 
    using (SqlBulkCopy bulk = new SqlBulkCopy(targetConn_reportDB, SqlBulkCopyOptions.KeepIdentity, null) { DestinationTableName = "PatientEvent" }) 
    { 
     bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("PatientID", "PatientID")); 
     bulk.WriteToServer(reader); 
    } 
} 
+0

現在就試試。我相信這正是我正在尋找並無法找到的。 –

+0

就是這樣,謝謝。在bulk.writetoserver之前只丟失了targetConn_reportDB.Open().... –