SQL Server批量复制插入百万条记录很慢

时间:2016-01-07 17:54:32

标签: c# sql sql-server-2005 poc

我有一张包含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保持服务器端并将记录从数据库推送到新的像SSIS一样的桌子?

似乎批量拷贝本身闪电很快,但是适配器填充失败,因为它耗尽了内存,试图用100万条记录填充适配器。如果不一次做一行,我只想在表之间移动数据。

一个表有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"));
}

1 个答案:

答案 0 :(得分:5)

您是否尝试过使用WriteToServer的{​​{1}}重载,那么您根本不需要使用IDataReader

DataTable