Как установить dataadapter.uppdateBatchsize на «оптимальное» значение?
-
01-10-2019 - |
Вопрос
Я наконец-то получил мою вставку партии работать, и теперь я возобновился размером партии, но я не вижу никакой разницы в производительности между значением 50 и значением 10000. Это кажется очень странным для Я, но я не знаю, что происходит за сценой, так что это может быть нормальное поведение.
Я вставляю 160 тысяч строк в таблицу, и среднее время для моих проверенных значений составляет 115 +/- 2 секунды. Без дозирования требуется 210 секунд, поэтому я вполне доволен улучшением. Целевая таблица:
CREATE TABLE [dbo].[p_DataIdeas](
[wave] [int] NOT NULL,
[idnumber] [int] NOT NULL,
[ideaID] [int] NOT NULL,
[haveSeen] [bit] NOT NULL CONSTRAINT [DF_p_DataIdeas_haveSeen] DEFAULT ((0)),
CONSTRAINT [PK_p_DataIdeas] PRIMARY KEY CLUSTERED
(
[wave] ASC,
[idnumber] ASC,
[ideaID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]
Я читаю Что искать при настройке UpdateBatchsize И ответ должен был просто проверить пару разных ценностей. Я могу понять, но нельзя можно будет рассчитать или, по крайней мере, догадка хорошей ценностью, если вы знаете дизайн таблицы, вопрос SQL и данные, которые собираются быть вставлены?
Есть ли лучшие практики, что кто-то может порекомендовать?
Решение
Вы можете увидеть эффект дозирования либо, глядя на SQL Profiler или позвонив SqlConnection.RetrieveStatistics()
. Отказ То, что вы видите, состоит в том, что каждая пакет соответствует одной раундной поездке в БД.
Что касается того, как оптимизировать размер партии, очень грубые правило, что производительность имеет тенденцию прекращать улучшение с размерами партии выше около 50 - на самом деле, иногда большие партии могут работать медленнее, чем медленнее. Если я слишком занят, чтобы проверить, я обычно начинаю с партии около 20 (если я не использую таблицу ценных параметров, где партии до 500 могут быть быстрее, чем меньшие). Тем не менее, оптимальное число зависит от таких вещей, как общий размер вкладышей (все ли они вписываются в RAM), насколько быстро диски состоят в том, что ваш журнал DB находится включен, есть ли журнал на своем собственном диске / LUN ( Большой Perfo стоит, если это не) и т. Д.
Достижимая скорость обычно ограничена первым по количеству круглых поездок, а затем по размеру транзакции, затем перезапустить скорость диска (особенно возможен, возможен ли последовательный доступ или если он вынужден случайным образом из-за конкуренции с другими файлами на одних и тех же шпинделях), и, наконец, ОЗУ. Однако все факторы также в некоторой степени связаны.
Первый шаг в улучшении совершенства ваших вкладов будет делать их в транзакциях - возможно, одна транзакция каждая пакет или два. Кроме того, таблицы ценные параметры, вероятно, следующий шаг, используя сохраненную процедуру с INSERT INTO Table SELECT column FROM @TableArgument
.
Другие советы
Хотя изменение UpdateBatchSize будет помогать в некоторой степени, основной подход к использованию PADUADADAPTER для обновления много записей будет медленным. Это связано с тем, что в конечном итоге отдельная оператор SQL (вставка, обновление, обновление или удаление или удаление) будет сгенерировано по даннымадапателю для каждой строки. UPDATEBATCHSIZE влияет только на то, сколько из этих отдельных операторов отправляются в одну партию TSQL при отправке на SQL Server.
Чтобы получить гораздо большие улучшения в производительности, вы хотите, чтобы SQLSERVER вставить / обновить / удалить много записей в одном операторе (обычно используя соединение каких-либо). Таблица оценивает параметры (как упомянуто Рикнз) - один из способов этого. Другая возможность использует SQLBULKCOPY (хотя вам, как правило, нужно использовать постановку таблицы для этого).
Убедитесь, что существует также активная транзакция, она значительно улучшит производительность (около 30x в моих тестах, используя mysqldataAdapter).