C#优化:在数据库中插入2亿行
我有以下(简化)代码,我想优化速度:
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本身分配值certificate是慢的。
我不知道DataTables是如何工作的所以我想知道我是否通过首先创建一个可重用的数组,然后将它分配给DataRow,然后将DataRow添加到DataTable来创建不必要的开销? 或者首先使用DataTable不是最佳的? 输入来自数据库。
我不太关心LOC,只关心速度。 任何人都可以就此提出一些建议吗?
对于这么大的桌子,你应该使用
public void WriteToServer(IDataReader reader)
方法。
这可能意味着你必须用自己的代码实现自己的“假” IDataReader
接口(如果你没有从现有的IDataReader
获取数据),但这样,你将IDataReader
获得“流” ,并将避免2亿次循环。
我不建议在内存中保存一个巨大的数据表,而是建议实现一个IDataReader
,它在批量复制时提供数据。 这将减少将所有内容保留在内存中的需要,因此应该有助于提高性能。
您不应该在内存中构造整个数据表。 使用WrtieToServer的这个重载 ,它接受DataRow数组。 只需将数据分成几部分。