Эффект пакетирования можно увидеть, посмотрев на SQL Profiler или вызвав SqlConnection.RetrieveStatistics()
. То, что вы должны увидеть, - это то, что каждая партия соответствует одному обращению к базе данных.
Что касается того, как оптимизировать размер пакета, очень грубое правило заключается в том, что производительность, как правило, перестает улучшаться при размерах пакета выше 50 - фактически, иногда большие партии могут работать медленнее, чем меньшие. Если я слишком занят, чтобы тестировать, я обычно начинаю с пакета из 20 (если я не использую табличные параметры, где пакеты до 500 могут быть быстрее, чем меньшие). Однако оптимальное количество зависит от таких факторов, как общий размер вставок (все они будут помещаться в ОЗУ), скорость диска, на котором расположен журнал вашей БД, находится ли журнал на отдельном диске / LUN ( большая стоимость, если это не так) и т. д.
Достижимая скорость, как правило, ограничивается сначала количеством циклов, затем размером транзакции, а затем скоростью лог-диска (в частности, возможен ли последовательный доступ или если он принудительно выбран случайным образом из-за конкуренции с другими файлами на тех же шпинделях) и, наконец, RAM. Тем не менее, все факторы также в некоторой степени взаимосвязаны.
Первым шагом в улучшении производительности ваших вставок будет выполнение их в транзакциях - возможно, по одной транзакции в каждом пакете или двух. Помимо этого, табличными параметрами, вероятно, является следующий шаг, использующий хранимую процедуру с INSERT INTO Table SELECT column FROM @TableArgument
.