Свертка базы данных — это ответственный процесс, который часто приурочен к окончанию календарного года. Когда объем базы достигает 40 Гб и более, стандартные механизмы могут работать крайне медленно. В данной статье мы проанализируем, какой вариант работы (SQL или файловый) выбрать для проведения этой процедуры, и разберем по шагам, как максимально ускорить процесс удаления помеченных объектов.
Проанализируем технические аспекты обоих вариантов. Для базы объемом 40 Гб однозначным фаворитом является SQL-вариант. Рассмотрим причины, по которым файловая база проигрывает в данной ситуации:
Таким образом, даже если ваша рабочая база файловая, для проведения свертки рекомендуется временно перевести её в SQL-вариант на мощном сервере (например, с процессором Core i7 9th gen и NVMe SSD), а после завершения всех процедур вернуть обратно.
Чтобы свертка прошла максимально быстро, нам необходимо подготовить среду СУБД. Разберем ключевые настройки:
Перевод модели восстановления в SIMPLE. Это критически важно при массовом удалении данных. В модели FULL лог транзакций (файл .ldf) мгновенно разрастется до сотен гигабайт, что может остановить работу из-за нехватки места на диске.
ALTER DATABASE [ИмяВашейБазы] SET RECOVERY SIMPLE WITH NO_WAIT;
Настройка TempDB. При поиске ссылок на удаляемые объекты 1С активно использует временные таблицы. Разместим tempdb на самом быстром диске (в идеале на RAM-диске) и разделим её на несколько файлов (от 4 до 8 в зависимости от количества ядер процессора).
Одной из главных причин «зависания» свертки на этапе удаления документов является постоянный пересчет итогов. Выясним причину: при удалении каждого документа система пытается обновить итоги по всем регистрам, в которых он делал движения. Чтобы избежать этого, мы должны отключить использование итогов перед массовым удалением и включить их только после завершения всех процедур.
Рассмотрим пример кода для управления итогами:
// Отключение итогов для всех регистров накопления
Для Каждого Регистр Из РегистрыНакопления Цикл
Регистр.УстановитьИспользованиеИтогов(Ложь);
КонецЦикла;
// Аналогично для регистров бухгалтерии
Для Каждого Регистр Из РегистрыБухгалтерии Цикл
Регистр.УстановитьИспользованиеИтогов(Ложь);
КонецЦикла;
После удаления объектов не забудьте включить итоги обратно и выполнить их пересчет. Это займет время, но суммарно процесс пройдет в несколько раз быстрее.
Стандартная обработка удаления помеченных объектов работает в один поток и часто делает лишние проверки. Рассмотрим способы ускорения этой процедуры.
Проанализируем ситуацию: если у нас 100 000 объектов на удаление, мы можем разделить их на пакеты (например, по 15 000) и запустить удаление в несколько потоков через ФоновыеЗадания. Это позволит загрузить все ядра процессора и максимально использовать пропускную способность дисковой подсистемы.
Вместо того чтобы пытаться удалить всё сразу, разберем методику удаления порциями. Это помогает избежать переполнения памяти сервера 1С и SQL. Рекомендуется удалять объекты транзакциями по 500–1000 штук.
Если вы на 100% уверены, что на удаляемые объекты нет ссылок в нужных периодах (например, вы уже сформировали остатки и проверили их), можно использовать метод Объект.Удалить(). Этот метод выполняет непосредственное удаление записи из таблицы БД без контроля ссылочной целостности, что работает мгновенно.
Внимание! Используйте этот метод только после создания полной резервной копии и понимания структуры связей в базе.
// Пример быстрого удаления без проверки ссылок
ОбъектСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("001");
Если Не ОбъектСсылка.Пустая() Тогда
Объект = ОбъектСсылка.ПолучитьОбъект();
Объект.Удалить(); // Прямое удаление из БД
КонецЕсли;
В некоторых случаях, вместо того чтобы мучительно долго удалять миллионы записей из базы 40 Гб, эффективнее использовать метод переноса в чистую базу. Рассмотрим этот алгоритм:
Этот метод часто оказывается быстрее, так как платформа 1С быстрее записывает новые данные в пустые таблицы, чем удаляет старые из фрагментированных индексов огромной базы.
После того как вы удалили данные, физический размер файла базы данных в SQL не уменьшится сам по себе. Более того, индексы будут сильно фрагментированы. Проанализируем необходимые регламентные операции:
UPDATE STATISTICS). SQL Server должен «понять», что данных стало значительно меньше, чтобы строить оптимальные планы запросов.REBUILD).SHRINKDATABASE, чтобы вернуть свободное место операционной системе.Подводя итог, можно сказать: используйте SQL, отключайте итоги, удаляйте данные порциями в несколько потоков, и ваша свертка базы объемом 40 Гб завершится в разумные сроки, а не затянется на неделю.