Как установить dataadapter.uppdateBatchsize на «оптимальное» значение?

StackOverflow https://stackoverflow.com/questions/3565745

Вопрос

Я наконец-то получил мою вставку партии работать, и теперь я возобновился размером партии, но я не вижу никакой разницы в производительности между значением 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top