Почему база SQL имеет большой размер при малом количестве документов в 1С и как это исправить?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При администрировании баз данных 1С на платформе Microsoft SQL Server системные администраторы и разработчики часто сталкиваются с парадоксальной ситуацией: документов в базе мало, данные активно удаляются, а размер файлов .MDF и .LDF остается огромным или даже неоправданно растет. В этой статье мы подробно разберем, почему так происходит, как настройки системных баз влияют на новые информационные базы и каким образом правильно высвобождать дисковое пространство без вреда для производительности.

Проблема 1: Новые или пустые базы сразу занимают много места

Рассмотрим ситуацию, когда при создании абсолютно пустой базы в SQL Server ее размер мгновенно составляет несколько гигабайт (например, 10 Гб), хотя конфигурация весит всего несколько мегабайт. Причина кроется в механизме работы SQL Server с системной базой данных model.

Проанализируем ситуацию: база model является шаблоном для всех вновь создаваемых баз данных на сервере. Когда вы создаете новую базу через 1С или среду SQL Server Management Studio (SSMS), SQL Server просто копирует структуру и настройки из model. Если в настройках этой системной базы установлен параметр Initial Size (начальный размер) в 10 Гб, то любая новая база будет резервировать этот объем на диске сразу после создания.

Как это исправить:

  1. Откроем SQL Server Management Studio (SSMS).
  2. Перейдем в раздел System Databases (Системные базы данных).
  3. Нажмем правой кнопкой мыши на базу model и выберем Properties (Свойства).
  4. В открывшемся окне перейдем на вкладку Files (Файлы).
  5. Проверим столбец Initial Size (MB). Если там указано большое значение (например, 10240 Мб), его следует уменьшить до стандартных значений (например, 8 Мб для данных и 8 Мб для лога).
  6. Также проверим параметры Autogrowth (Авторасширение). Рекомендуется устанавливать фиксированный шаг (например, 256 Мб или 512 Мб), а не процентное соотношение, чтобы избежать частой дефрагментации файловой системы.

Проблема 2: Удаление данных в 1С не уменьшает размер файла базы

Выясним причину, по которой после удаления 30 Гб «ненужных» документов и записей регистров размер файла базы данных (.mdf) не уменьшился ни на мегабайт. Это является штатным поведением SQL Server.

Когда данные удаляются из таблиц, SQL Server не отдает место операционной системе. Он просто помечает страницы внутри файла базы данных как «свободные» для повторного использования. Это сделано для оптимизации производительности: операция расширения файла на диске очень дорогая и ресурсоемкая, поэтому сервер предпочитает удерживать уже выделенное пространство «про запас».

Тестирование и исправление (ТИИ) в конфигураторе 1С в данном случае не поможет, так как ТИИ работает с логической структурой данных (объектами 1С), а не с физическим распределением байтов на диске в среде SQL.

Как реально уменьшить размер базы (Операция Shrink)

Если вам критически важно вернуть свободное место операционной системе (например, заканчивается место на диске), необходимо выполнить операцию сжатия — Shrink. Разберем по шагам, как это сделать:

Для выполнения сжатия через графический интерфейс SSMS:

  1. Щелкнем правой кнопкой мыши по нужной базе данных.
  2. Выберем пункт Tasks (Задачи) -> Shrink (Сжать) -> Database (База данных).
  3. В появившемся окне будет указано, сколько свободного места можно высвободить. Нажмем "ОК".

Однако более профессиональным подходом является использование T-SQL команд. Например, для сжатия файла данных до минимально возможного размера можно использовать следующую команду:


USE [Имя_Вашей_Базы];
GO
DBCC SHRINKDATABASE(N'Имя_Вашей_Базы');
GO

Важное предупреждение: Операция Shrink вызывает сильнейшую фрагментацию индексов. После ее завершения производительность 1С может значительно снизиться. Поэтому всегда после сжатия базы необходимо выполнять перестроение индексов (Rebuild Index).

Роль модели восстановления и лога транзакций (.LDF)

Часто «раздувание» базы связано не с данными, а с файлом лога транзакций. Проанализируем настройки модели восстановления (Recovery Model):

  1. Full (Полная): SQL Server записывает каждое изменение в лог и хранит его до тех пор, пока не будет сделан бэкап лога транзакций. Если бэкапы лога не настроены, файл .ldf будет расти до бесконечности.
  2. Simple (Простая): Лог транзакций очищается автоматически после завершения каждой транзакции. Для большинства баз 1С, где не требуется восстановление «на определенную секунду», рекомендуется использовать именно эту модель.

Чтобы сменить модель на простую и сжать лог, выполним следующие действия:


ALTER DATABASE [Имя_Вашей_Базы] SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE (N'Имя_Лог_Файла' , 1);
GO

Специфические причины в 1С: Что занимает место внутри базы

Если после всех манипуляций база всё равно кажется подозрительно большой, стоит заглянуть внутрь структуры 1С. Рассмотрим основные «пожиратели» места:

Рекомендации по обслуживанию

Проанализировав ситуацию, мы можем сформулировать алгоритм действий для поддержания оптимального размера SQL-базы:

  1. Настройте шаблон model: Установите разумный начальный размер (8-64 Мб) и фиксированный шаг роста.
  2. Выберите правильную модель восстановления: Для баз 1С чаще всего подходит Simple.
  3. Используйте сжатие данных (Compression): Начиная с версии SQL Server 2016 SP1, доступно сжатие таблиц (Row/Page compression). Это позволяет уменьшить физический размер базы в 2-3 раза почти без потери производительности. Это гораздо эффективнее и полезнее, чем регулярный Shrink.
  4. Не делайте Shrink постоянно: Эту операцию стоит проводить только после разового удаления огромного массива данных. Постоянное сжатие «убивает» дисковую подсистему из-за фрагментации.

Таким образом, большой размер базы при малом количестве документов чаще всего является следствием настроек резервирования места или особенностей ведения логов транзакций, а не реальным объемом полезной информации.

← На главную