SubSonic AddMany() против цикла foreach Add()
Я пытаюсь выяснить, является ли метод SubSonics AddMany() быстрее, чем простой цикл foreach. Я немного покопался на сайте SubSonic, но мало что видел по статистике производительности.
Что у меня сейчас есть. (.ForEach() просто имеет некоторую проверку, если не считать, что он работает так же, как forEach(.....){ do stuff})
records.ForEach(record =>
{
newRepository.Add(record);
recordsProcessed++;
if (cleanUp) oldRepository.Delete<T>(record);
});
Что тоже изменится
newRepository.AddMany(records);
if (cleanUp) oldRepository.DeleteMany<T>(records);
Если вы заметите, что с помощью этого метода я потеряю счет того, сколько записей я обработал, что не критично... Но было бы неплохо показать пользователю, сколько записей было перемещено с помощью этого инструмента.
Поэтому мои вопросы сводятся к следующему: будет ли AddMany () заметно быстрее в использовании? И есть ли способ подсчитать количество фактически скопированных записей? Если это удастся, могу ли я предположить, что все записи были обработаны? Если одна запись терпит неудачу, весь процесс терпит неудачу?
Заранее спасибо.
1 ответ
Просто чтобы уточнить, AddMany() генерирует отдельные запросы для каждой строки и отправляет их через пакет; DeleteMany() генерирует один запрос. Пожалуйста, обратитесь к исходному коду и сгенерированному SQL, если вы хотите знать, что происходит с вашими запросами.
Ваш первый подход медленный: 2*N запросов. Однако, если вы отправляете запросы с использованием пакета, это будет быстрее.
Ваш второй подход быстрее: N+1 запросов. Вы можете узнать, сколько будет добавлено, просто перечислив "записи".
Если существует риск превышения пределов емкости по размеру партии, то подайте 50 или 100 за один раз с небольшим штрафом.
Ваш последний вопрос зависит от транзакций. Если вся операция является одной транзакцией, она будет фиксироваться как одна. В противном случае каждый запрос будет автономным. Твой выбор.