Как часто вызывать DataContext.SubmitChanges() для большого количества вставок?

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

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


person Ed Power    schedule 01.07.2010    source источник
comment
У меня была такая же проблема, и я потратил целую вечность на поиск ответа. В конце концов, это стало моим спасением... наслаждайтесь. mikesknowledgebase.com/pages/LINQ/InsertAndDeletes.htm   -  person Mike Gledhill    schedule 12.07.2012


Ответы (4)


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

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

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

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

person Wim Haanstra    schedule 01.07.2010
comment
Это хороший момент в отношении получения обратно удостоверения личности. Меня беспокоит объем памяти, так как могут быть некоторые большие записи, но 1000 за раз — это хорошее место для начала. - person Ed Power; 01.07.2010
comment
Да, это одна вещь, которую я действительно ненавижу в этом. Иногда каждой записи требуется новый идентификатор, что заставляет вас отправлять записи слишком много для хорошей производительности. Это то, что вам нужно выяснить в своем коде, просто чтобы увидеть, где они вам нужны и куда вы можете отправить их позже. - person Wim Haanstra; 01.07.2010

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

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

person Frank Tzanabetis    schedule 01.07.2010

Для внесения изменений в одно поле для 1000 записей в пакете по сравнению с 1 за раз: 1 запись за раз занимает 0,1989 с/запись против пакета, который занимает 0,0711 с/запись. Таким образом, в моих тестах пакетная обработка примерно в 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%
1000 71,07 0,0711 103%
2000 138,64 0,0693 102%
10000 680,36 0,0680

person Fuyu Persimmon    schedule 12.08.2013

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

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

person Aren    schedule 01.07.2010