我有一张有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"));
}

最佳答案

您是否尝试过使用使用WriteToServerIDataReader重载,那么根本不需要使用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);
    }
}

关于c# - SQL Server批量复制插入百万条记录很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34661946/

10-12 00:38
查看更多