C# 优化 : Inserting 200 million rows into database

标签 c# datatable sqlbulkcopy

我有以下(简化的)代码,我想对其进行优化以提高速度:

long inputLen = 50000000; // 50 million 
DataTable dataTable = new DataTable();
DataRow dataRow;
object[] objectRow;
while (inputLen--)
{
    objectRow[0] = ...
    objectRow[1] = ...
    objectRow[2] = ...

    // Generate output for this input
    output = ...

    for (int i = 0; i < outputLen; i++) // outputLen can range from 1 to 20,000
    {
         objectRow[3] = output[i];
         dataRow = dataTable.NewRow();
         dataRow.ItemArray = objectRow;
         dataTable.Rows.Add(dataRow);
    }
}

// Bulk copy
SqlBulkCopy bulkTask = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null);
bulkTask.DestinationTableName = "newTable";
bulkTask.BatchSize = dataTable.Rows.Count;
bulkTask.WriteToServer(dataTable);
bulkTask.Close();

我已经在使用 SQLBulkCopy 来尝试加快速度,但事实证明,向 DataTable 本身赋值的速度很慢。

我不知道 DataTables 是如何工作的,所以我想知道我是否通过首先创建一个可重用数组,然后将其分配给 DataRow,然后将 DataRow 添加到 DataTable 来创建不必要的开销?还是首先使用 DataTable 不是最佳选择?输入来自数据库。

我不太关心 LOC,只关心速度。任何人都可以对此提出一些建议吗?

最佳答案

对于这么大的表,你应该改用

public void WriteToServer(IDataReader reader)

方法。

这可能意味着您必须使用您的代码为自己实现一个“假的”IDataReader 接口(interface)(如果您不从现有的IDataReader 获取数据) ),但这样一来,您将获得从头到尾的“流式处理”,并避免 2 亿次循环。

关于C# 优化 : Inserting 200 million rows into database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4860187/

相关文章:

javascript - 如何使用服务器端数据源在由 JQuery DataTable 生成的表上添加行号

c# - DataTable 不支持从 Xml 进行架构推断。?

c# - SqlBulkCopy 插入标识列

c# - 发布输出文件夹中的程序调试数据库文件

c# - 从 JSON 字符串中删除空数组成员

c# - 删除所有添加到 Canvas 的图像

c# - 你如何将 "using"用于 npgsql 而不是 trycatchfinally?

javascript - Laravel-数据表保护

c# - OracleBulkCopy内存泄漏(OutOfMemory异常)

c# - 违反 PRIMARY KEY 约束。无法在对象中插入重复的键