簡體   English   中英

SQL Server批量復制插入百萬條記錄很慢

[英]SQL Server bulkcopy insert million records is slow

我有一張有100萬條記錄的表。 我需要能夠將這些記錄移動到另一個數據庫和另一個表。

我正在使用存儲過程來獲取數據。 它填充一個數據適配器,然后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保留在服務器端,而只是將記錄從db推送到新表,例如SSIS?

似乎大容量副本本身快如閃電,但適配器填充失敗,因為它用盡了內存,試圖用一百萬條記錄填充適配器。 一次不做1行,我只想在表之間移動數據。

一個表具有27列,其中5個不在表2中,而表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"));
}

您是否嘗試過使用帶有IDataReaderWriteToServer重載,那么根本不需要使用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);
    }
}

暫無
暫無

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

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