C#优化:在数据库中插入2亿行

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接口(如果你没有从现有的IDataReader获取数据),但这样,你将IDataReader获得“流” ,并将避免2亿次循环。


热门答案

我不建议在内存中保存一个巨大的数据表,而是建议实现一个IDataReader ,它在批量复制时提供数据。这将减少将所有内容保留在内存中的需要,因此应该有助于提高性能。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因