tôi có như sau (đơn giản hóa) mã mà tôi muốn tối ưu hóa cho tốc độ:C# Tối ưu hóa: Chèn 200 triệu hàng vào cơ sở dữ liệu
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();
Tôi đã sử dụng SqlBulkCopy trong một nỗ lực để tăng tốc , nhưng nó xuất hiện gán giá trị cho chính DataTable chứng tỏ là chậm.
Tôi không biết DataTables hoạt động như thế nào nên tôi tự hỏi liệu mình có tạo ra các chi phí không cần thiết hay không bằng cách tạo một mảng có thể tái sử dụng, sau đó gán nó cho DataRow, sau đó thêm DataRow vào DataTable? Hoặc đang sử dụng DataTable không tối ưu ở nơi đầu tiên? Dữ liệu đầu vào đến từ cơ sở dữ liệu.
Tôi không quan tâm nhiều về LOC, chỉ tốc độ. Bất cứ ai có thể đưa ra một số lời khuyên về điều này?
Để thực hiện ví dụ, hãy xem 'SimpleDataReader' [ở đây] (https://groups.google.com/group/microsoft.public.dotnet.languages.csharp/msg/b1d70b504cdee2ad?hl=en) –