При оптимизации производительности 1С часто возникает задача кэширования «тяжелых» данных, которые обновляются фоновым заданием. Один из популярных подходов — использование РегистрСведений. Рассмотрим, как частое обновление 30 000 записей влияет на состояние базы данных SQL Server и как избежать негативных последствий.
Частая перезапись данных (удаление старых и вставка новых) — это интенсивная операция для СУБД. Рассмотрим основные факторы, влияющие на стабильность системы:
DELETE и INSERT происходит изменение страниц данных. SQL Server стремится оптимизировать размещение данных, но постоянная перезапись приводит к расщеплению страниц.Full, каждое изменение записывается в лог. При обновлении 30 000 записей каждую минуту размер лога может расти лавинообразно до выполнения бэкапа.DELETE освобождает место внутри файла, но не уменьшает размер файла на диске. Система будет повторно использовать это свободное место для новых записей, поэтому катастрофического бесконечного роста не будет, но процесс требует регулярного обслуживания.Чтобы минимизировать влияние на производительность, давайте разберем несколько стратегий реализации.
Согласно стандартам разработки 1С, для хранения подобных данных предпочтительнее использовать РегистрСведений, а не табличную часть справочника или документа. РегистрСведений позволяет обновлять данные точечно, тогда как при записи в табличную часть _Reference_VT система может блокировать всю таблицу, что негативно скажется на работе пользователей.
Вместо полной очистки и перезаписи всего регистра (метод «удалить всё — записать всё»), рассмотрим более интеллектуальный подход:
Запись только для тех строк, которые реально изменились.НаборЗаписей для конкретного измерения. Это позволит обновлять порции данных, не затрагивая весь регистр целиком.Не забывайте о базовых правилах обслуживания базы данных:
ТиИ или через SQL Server Agent).Simple для снижения нагрузки на лог.Read Committed Snapshot Isolation (RCSI), активные изменения данных создают версионность записей в TempDB. Обеспечьте достаточный объем и производительность дисков для временной базы.Вместо удаления всей таблицы, работайте с набором записей:
// Пример логики обновления регистра
НаборЗаписей = РегистрыСведений.НашРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Измерение.Установить(ЗначениеОтбора);
НаборЗаписей.Прочитать();
// Сравниваем новые данные с текущими
Если НужноОбновить(НаборЗаписей, НовыеДанные) Тогда
НаборЗаписей.Загрузить(НовыеДанные);
НаборЗаписей.Записать();
КонецЕсли;
Такой подход позволит значительно снизить нагрузку на SQL Server, уменьшить количество операций в логе транзакций и предотвратить избыточную фрагментацию индексов. Помните, что лучший способ оценить влияние — провести нагрузочное тестирование на копии базы, максимально приближенной по объему к продуктивной.