Задать вопрос

Как сделать 200 update c#/mssql ещё быстрее (с#/mssql) ?

200 update в базе в несколько миллионов записей
BEGIN TRANSACTION;
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s='test1';
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s='test2';
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s='test3';
.....
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s='test200';
COMMIT TRANSACTION

на ssd у меня пишутся друг за другом минуту - быстрее можно? Или менять базу, чтобы писалось быстрее?
  • Вопрос задан
  • 2697 просмотров
Подписаться 6 Оценить Комментировать
Ответ пользователя Sumor К ответам на вопрос (3)
@Sumor
Для того, чтобы оценить где можно улучшить нужно в первую очередь посмотреть планы выполнения update и времена в профайлере SQL-сервера.
1. Каждый индекс отнимает время на своё обновление. Возможно можно уменьшить количество индексов. Иногда выгодней их удалять и заводить заново после операций обновления. Тоже касается вычислимых полей, значения которых хранятся в таблице. Если переделать ключ таблицы в кластерный индекс, то это может улучшить время поиска и обновления записей.
2. Тригеры. Их можно также отключить перед выполнением пакета и включить после выполнения.
3. Уменьшить количество операций Update путём их объединения по каким-то признакам. Уменьшить количество обновлений в одной транзации.
4. Если позволяет структура базы данных, то возможно быстрее будет работать связка delete/insert. В этом случае можно включить режим Bulk Insert, который пишет данные сразу в таблицы минуя лог транзакций.
5. Модель восстановления — simple, full или bulk logged. Возможно в вашем случае модель full даст выигрыш в обновлении данных, но вы можете потерять в месте на жёстком диске и времени сохранения базы данных.
6. Физическое расположение контейнеров. Можно физически разнести таблицы, индексы и лог на три разных диска - тогда могут улучшиться временные показатели.
7. Использование секционированных таблиц и индексов. Возможно, если обновление происходит только в определённой части огромной таблицы, например, только в записях последнего года, то имеет смысл разбить её на секции.

В любом случае нужно исследовать каждую задачу оптимизации индивидуально. Нужно попробовать исключить каждый фактор и замерить время без него. Например, временно удалить все индексы в таблице и запустить пакет обновления.
Ответ написан
Комментировать