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

В любом случае нужно исследовать каждую задачу оптимизации индивидуально. Нужно попробовать исключить каждый фактор и замерить время без него. Например, временно удалить все индексы в таблице и запустить пакет обновления.
Ответ написан
Комментировать
@SashaSkot
Специалист широкого профиля
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s IN ('test1','test2','test3' )
Ответ написан
Комментировать
@VenSaitto
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s LIKE 'test[0-9]' OR s like 'test[1-9][0-9]' OR s LIKE 'test[1][0-9][0-9]' OR s = 'test200'

или S выбирать подзапросом
UPDATE T SET f1 = 1, f2 = 1, f3 = 1, f4 = 1 WHERE s IN (SELECT .....)

Проверить индексы, увеличение числа индексов замедляет операции добавления, обновления, удаления строк таблицы, поскольку при этом приходится обновлять сами индексы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы