Я использую SqlBulkCopy
чтобы вставить содержимое данных, datatable
миллион записей (каждая запись имеет около 10 столбцов) в таблицу базы данных. Я вижу некоторые неустойчивые значения для продолжительности массовой копии при изменении свойства размера партии ( bulkCopy.BatchSize
).
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn.ConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.CheckConstraints))
{
bulkCopy.DestinationTableName = destinationTableName;
bulkCopy.BatchSize = 100000;
bulkCopy.BulkCopyTimeout = 1800;
if (matchingColumns != null || matchingColumns.Count > 0)
foreach (KeyValuePair<string, string> kv in matchingColumns)
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(kv.Key, kv.Value));
bulkCopy.WriteToServer(dt);
}
Когда я не использовал размер партии, процесс был выполнен за 7 минут. Затем я установил размер партии до 100 000, а время было около 5:30, а затем я установил ее на 50 000, а время увеличилось до 10 минут.
Я хотел бы знать влияние размера партии на скорость INSERT. Делает ли это, в общем, все быстрее или медленнее?
Взгляните на этот документ, в котором подробно анализируются размеры партии:
Существует много данных о загрузке сети и т. Д., Используя разные размеры партии, но вывод заключается в следующем:
Мы не нашли ничего, что упоминалось в «Книжном листе», или мы никогда не видели ничего интересного во время нашего опыта, это говорит нам о том, что лучше всего делать с BatchSize - это оставить его равным нулю, что является его значением по умолчанию, поскольку любое значение отличное от того, что уменьшит производительность процесса загрузки
Это, похоже, согласуется с вашим тестированием.
РЕДАКТИРОВАТЬ:
Всякий раз, когда я использовал SqlBulkCopy в прошлом, я, как правило, сам контролирую размер партии, делая несколько вложений, а затем просто свойство NotifyAfter и событие SqlRowsCopied, чтобы получать обновления прогресса по мере продвижения копии.