【问题标题】:SQL Server bulkcopy insert million records is slowSQL Server bulkcopy 插入百万条记录很慢
【发布时间】:2016-04-12 05:52:12
【问题描述】:

我有一个包含 100 万条记录的表。我需要能够将这些记录移动到另一个数据库和另一个表中。

我正在使用存储过程来获取数据。它填充数据适配器,然后将数据 bcp 到新表中。

我们使用的是 SQL Server 2005 和 C# 4。我们将迁移到带有 C# 4.6 或 5.0 的 SQL Server 2012 或 2014 和 Visual Studio 2015。如果有任何功能可以使它正常工作。

  • 对于 10k 条记录,处理时间不到 1 秒
  • 对于 500k 条记录,数据适配器内存不足,进程失败。 批处理到 10 万条记录,select 语句是 SQL 中的问题,一次返回 10 万条记录,每个循环需要 2 分钟。

有没有办法,或者我下面的代码有什么问题,可以防止数据适配器被填充,而是映射列并让BulkCopy留在服务器端,只需将记录从数据库推送到新表,比如也许是SSIS?

大容量复制本身似乎快如闪电,但适配器填充失败,因为它在尝试用 100 万条记录填充适配器时内存不足。一次不做 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"));
}

【问题讨论】:

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


    【解决方案1】:

    您是否尝试过使用带有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);
        }
    }
    

    【讨论】:

    • 现在试试。我相信这正是我正在寻找但无法找到的。
    • 就是这样,谢谢。只是在 bulk.writetoserver 之前缺少 targetConn_reportDB.Open() ....
    猜你喜欢
    • 2012-05-30
    • 2015-07-14
    • 2021-11-07
    • 2023-01-31
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2014-09-18
    • 2011-02-15
    相关资源
    最近更新 更多