После проведения масштабного обновления нетиповой конфигурации 1С администраторы и разработчики часто сталкиваются с ситуацией, когда физический размер файлов базы данных на сервере MSSQL увеличивается в полтора-два раза. Разберем подробно, почему это происходит, можно ли уменьшить размер базы штатными средствами 1С, почему классическое сжатие (SHRINK) файлов данных может навредить производительности и как правильно решать проблему избыточного дискового объема.
Проанализируем основные технические причины, приводящие к резкому увеличению дискового пространства базы данных при обновлении конфигурации:
Full Recovery Model) все операции массового переноса данных и перестроения индексов фиксируются в журнале. Без регулярного резервного копирования лога размер файла транзакций может превысить размер основных данных.Config, ConfigCAS и Params сохраняют новые версии конфигурации поставщика и основной конфигурации, что заметно увеличивает объем данных.Выясним, существует ли возможность сжать базу средствами Конфигуратора. В режиме «Тестирование и исправление» (ТиИ) присутствует флаг «Сжатие таблиц информационной базы». Однако в клиент-серверном варианте работы (MSSQL) данная процедура лишь выполняет внутреннюю реорганизацию страниц в таблицах СУБД и удаляет логически помеченные на удаление записи. Она не возвращает освободившееся дисковое пространство операционной системе и не уменьшает физический размер файлов .mdf и .ldf.
Платформа 1С не имеет встроенных методов для выполнения физического сжатия файлов базы данных на стороне СУБД. Управление размером файлов данных лежит исключительно в зоне ответственности администратора баз данных.
Сжатие файла данных (DBCC SHRINKFILE или DBCC SHRINKDATABASE) возвращает неиспользуемое пространство операционной системе, однако регулярное выполнение этой операции на рабочих базах 1С приводит к серьезным проблемам:
Autogrowth). Каждое такое расширение сопровождается задержкой операций ввода-вывода (I/O) и блокировками.Свободное место внутри файла .mdf является резервом СУБД для будущих операций вставки данных, и его наличие — нормальный режим работы MSSQL.
Одной из скрытых причин избыточного роста базы является накопление «зависших» остатков с противоположными знаками. Рассмотрим, как с помощью консоли запросов найти развернутые остатки по измерению (например, по номерам ГТД при нулевом или ошибочном общем остатке):
ВЫБРАТЬ
ТоварыОрганизацийОстатки.Организация КАК Организация,
ТоварыОрганизацийОстатки.СтруктурноеПодразделение КАК СтруктурноеПодразделение,
ТоварыОрганизацийОстатки.Товар КАК Товар,
ТоварыОрганизацийОстатки.НомерГТД КАК НомерГТД,
ТоварыОрганизацийОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыОрганизацийБУ.Остатки КАК ТоварыОрганизацийОстатки
УПОРЯДОЧИТЬ ПО
Организация,
СтруктурноеПодразделение,
Товар,
НомерГТД
Если по одной номенклатуре в разрезе разных ГТД присутствуют остатки со значениями +10 и -10, регистр фактически не закрыт. Таблица итогов регистра накопления хранит избыточные строки, что увеличивает объем базы и замедляет проведение документов. Для сопоставления физических имен таблиц MSSQL с метаданными 1С используем метод ПолучитьСтруктуруХраненияБазыДанных().
Разберем корректные альтернативы сжатию файлов данных:
.dt с последующей загрузкой в новую пустую базу данных на MSSQL пересоздает структуру всех таблиц с нуля. Это полностью устраняет неиспользуемые пустоты и фрагментацию без выполнения команд сжатия на уровне СУБД.Simple), после обновления выполняют резервное копирование, возвращают модель Full и сжимают файл лога.PAGE) или строк (ROW) для больших таблиц движений и версий объектов позволяет уменьшить объем дискового пространства в 2–3 раза и снизить нагрузку на дисковую подсистему без фрагментации файлов.