Многие администраторы и разработчики 1С сталкиваются с парадоксальной ситуацией: после выполнения стандартной процедуры Тестирование и исправление (ТиИ), которая, казалось бы, должна оптимизировать данные, физический размер базы данных на SQL Server существенно увеличивается. Давайте разберем по шагам, почему это происходит, как устроены механизмы хранения данных в СУБД и какими способами можно реально уменьшить объем «распухшей» базы. При обслуживании нескольких информационных баз регулярный запуск сервисных процедур и резервного копирования можно упростить, настроив автоматическое архивирование, тестирование и обновление баз 1С.
Для начала проанализируем ситуацию, описанную в теме. Исходная база ЗУП занимает 41 Гб, файл выгрузки .dt — 2 Гб, а после загрузки в новую базу и проведения ТиИ объем подскакивает до 53 Гб. Нам важно понимать, что файл .dt — это сжатый архив данных, и его размер никогда не будет соответствовать размеру базы в SQL. Однако двукратный рост после тестирования объясняется спецификой работы SQL Server и платформы 1С.
Основная причина кроется в пункте Реструктуризация таблиц информационной базы. Рассмотрим подробнее, что происходит «под капотом»:
.mdf не возвращается операционной системе автоматически. Оно помечается как «свободное внутри файла» для будущих операций. С точки зрения Windows файл базы данных остается огромным.Full, файл .ldf будет расти до тех пор, пока не будет сделан бэкап лога.Прежде чем приступать к сжатию, нам необходимо выяснить, какие именно таблицы занимают больше всего места. Для этого воспользуемся SQL-скриптом, который выведет детальную информацию о данных и индексах каждой таблицы. Выполним следующий код в SQL Server Management Studio:
USE [Имя_Вашей_Базы]
GO
CREATE TABLE #temp (
table_name sysname ,
row_count INT,
reserved_size VARCHAR(50),
data_size VARCHAR(50),
index_size VARCHAR(50),
unused_size VARCHAR(50))
SET NOCOUNT ON
INSERT #temp
EXEC sp_msforeachtable 'sp_spaceused ''?'''
SELECT a.table_name,
a.row_count,
COUNT(*) AS col_count,
a.data_size
FROM #temp a
INNER JOIN information_schema.columns b
ON a.table_name collate database_default
= b.table_name collate database_default
GROUP BY a.table_name, a.row_count, a.data_size
ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC
DROP TABLE #temp
Проанализируем результаты. Если лидерами роста являются таблицы с именами типа _InfoReg... (Регистры сведений) или _AccumReg... (Регистры накопления), это нормально для ЗУП. Если же «пухнут» таблицы Config или ConfigSave, возможно, в базе хранится избыточное количество версий конфигурации.
Поскольку после ТиИ внутри файла .mdf остается много пустого места, нам нужно выполнить операцию Shrink (сжатие). Разберем, как это сделать правильно. Важно помнить, что сжатие файлов данных вызывает сильную фрагментацию индексов, поэтому его следует делать только после массовых операций типа реструктуризации.
Для уменьшения файла данных используем команду:
DBCC SHRINKDATABASE (N'Имя_Вашей_Базы');
Или через интерфейс SSMS: Задачи -> Сжать -> База данных. Это вернет неиспользуемое пространство операционной системе, и размер файла .mdf на диске уменьшится до реального объема данных.
Если после шринка размер базы все еще кажется избыточным, рассмотрим современный метод — Data Compression (сжатие страниц или строк). Начиная с SQL Server 2016 SP1, эта функция доступна во всех редакциях, включая Standard. Для баз 1С, где много пустых значений и повторяющихся типов данных, это дает колоссальный эффект.
Для применения сжатия ко всем разделам конкретной таблицы выполним команду:
ALTER TABLE [Имя_Таблицы] REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE);
Рассмотрим преимущества этого подхода: сжатие уровня PAGE позволяет упаковать данные в 2–5 раз. При этом нагрузка на процессор немного возрастает, но скорость чтения с диска увеличивается, так как серверу нужно считывать меньше физических блоков. Это отличный способ «ужать» базу без потери функциональности.
Выясним еще одну причину «пухлости» — коэффициент заполнения страниц индексов (Fill Factor). При выполнении реиндексации в рамках ТиИ, если в настройках сервера Fill Factor установлен, например, на 80%, SQL Server намеренно оставляет 20% каждой страницы данных пустой. Это нужно для ускорения вставки новых записей, но увеличивает общий размер базы на те же 20%.
Если база используется преимущественно для отчетов (как это часто бывает в ЗУП в периоды между расчетами), установим Fill Factor в значение 0 или 100. Это заставит сервер упаковывать индексы максимально плотно.
Посмотрим на проблему со стороны самой платформы 1С. База может расти из-за:
ЗУП история изменений объектов может занимать огромный объем. Рекомендуется настроить регламентное задание по очистке версий старше 6 месяцев.Подведем итог: рост базы после ТиИ — это нормальное поведение SQL Server из-за механизма реструктуризации. Чтобы вернуть базу к минимальному размеру, необходимо выполнить последовательность: ТиИ -> Реиндексация SQL -> Shrink базы. А для радикального уменьшения объема стоит внедрить сжатие таблиц DATA_COMPRESSION = PAGE.