Как часто вызывать DataContext.SubmitChanges () для большого количества вставок? - PullRequest
0 голосов
/ 01 июля 2010

Сколько InsertOnSubmit мне нужно позвонить, прежде чем звонить SubmitChanges?Я добавляю данные из веб-службы, которая может возвращать десятки тысяч записей по одной записи за раз.Класс-обертка вокруг веб-службы предоставляет записи коллекции IEnumberable, чтобы скрыть сложный механизм разбиения на фрагменты.

Существуют ли рекомендации относительно того, сколько вставок мне следует накопить перед отправкой?

Ответы [ 4 ]

3 голосов
/ 12 августа 2013

Для внесения изменений в одно поле для 1000 записей в пакете против 1 за раз: 1 запись за один раз занимает 0,1989 с / запись по сравнению с пакетом, который занимает 0,0711 с / запись. Так что Batch примерно в 3 раза быстрее в моих тестах. Обратите внимание, что размеры партий различаются по эффективности.

submitchanges () 1 запись за раз
записей в секунду / запись
1000 198,95 0,1989

Пакетная отправка ()
записей в секунду / запись% изменения
100 12,20 0,1220 133%
200 18,33 0,0916 122%
500 37,59 0,0752 106%
1 000 71,07 0,0711 103%
2000 138,64 0,0693 102%
10 000 680,36 0,0680

3 голосов
/ 01 июля 2010

Ну, я сделал это с сотнями тысяч записей в нескольких таблицах за один раз без проблем.Фактически, в то время как вызов метода SubmitChanges () для каждой функции InsertOnSubmit () в подобном случае потребовал бы нескольких часов, простой вызов метода SubmitChanges () в самом конце уменьшил бы время, необходимое для вставки такого количества записей, до пары минут.1002 * В случае, который я описал выше, у меня была схема представления отчетов с таблицей заголовков, таблицей подробностей (которая связана с заголовком) и таблицей атомов (которая связана с деталями).Для каждой записи заголовка у меня было несколько таблиц подробностей, которые затем снова были бы связаны несколькими записями атомов.В некоторых случаях я заканчивал тем, что вставлял gazillions записей, и все они без проблем шли бы с единственным вызовом SubmitChanges () в конце, и все это работало очень хорошо.

3 голосов
/ 01 июля 2010

Это также зависит от типа данных, которые вам нужно вставить.Иногда мне нужно вставить много записей, где мне также нужен идентификатор, чтобы вставить больше записей в другую таблицу.

Поскольку идентификатор присваивается при отправке изменений в базу данных, мне необходимо вызвать SubmitChangesв определенное время.

Когда это не нужно, я просто отправляю их с 1000 или около того (в зависимости от общего количества записей, которые мне нужно вставить).

Возможно, вы могли бысделать некоторые тесты скорости, которые лучше всего подходят для вас.В зависимости от аппаратного обеспечения, ожиданий количества записей и т. Д.

1 голос
/ 01 июля 2010

На самом деле никаких «Руководящих принципов» не существует.Я бы сказал, для эффективности вы хотите собрать кучу, может быть, не 10 КБ, но скажем, 100?Это резко сократит количество запросов к БД и не должно излишне увеличивать объем кэширования оперативной памяти при локальном построении транзакции.

Возможно, вам следует протестировать пару различных значений и профилировать производительность (память и скорость).чтобы найти оптимальное решение для вашего оборудования.

...