как бык корову по скорости при вставке порядка от 100 и больше записей одновременно - и так известно.
А когда после вставки нужно обновить поле записям эдак в количестве несколько тысяч после вставки сотен булк инсёртом. По некоему критерию. Ну то я упрощаю, но в общем так. Как это делается через ORM? Грузишь себе эти несколько тысяч связанных записей, целиком. Исправляешь значения в них. И делаешь сохранение. И они обновлённые целиком летят в SQL, даже и с отключенным трекингом.
Как это делается хранимкой?
Схематично:
UPDATE x
SET column1 = ...
FROM table1 AS x
INNER JOIN table2 ON ...
WHERE table2 ...
То есть все джойны и фильтры в одном запросе с апдейтом и обновляется ровно одна колонка, вместо пересылки туда-сюда всей сущности, причём при обновлении всей сущности (даже если изменяется одна колонка) обновляется хренова гора навешенных индексов. А при апдейте через SQL таким запросом - обновляются только индексы, которые связаны с изменяемым столбцом, и всё.
Результат, как говорится, налицо. Ускорение в десятки раз.
для EF есть экстеншены, которые позволяют делать BulkUpdate не выкачивая ничего, насколько я знаю. Вполне возможно что это дело ускорит от изначальных 1900 секунд до чего-нибудь более-менее приемлимого
Какие-то очевидные вещи написал. Все знают что в еф нет балк инсерта и что в этом он проигрывает.
Обсуждают сегодня