Нередко после физического или программного удаления сотен тысяч записей из регистров и документов размер файлов информационной базы на диске (.mdf и .ldf) не уменьшается ни на один мегабайт. Разберем детально, почему это происходит, как выяснить истинных «пожирателей» дискового пространства и какие регламентные процедуры необходимо выполнить для реального уменьшения объема информационной базы.
Проанализируем механику работы СУБД Microsoft SQL Server. Когда в 1С удаляются записи или целые документы, СУБД физически не возвращает освободившиеся экстенты и страницы данных операционной системе. Эти страницы помечаются внутри файла .mdf как свободные и резервируются для будущих операций вставки. В результате размер файла данных остается неизменным, а файл журнала транзакций .ldf при массовом удалении данных может многократно увеличиться из-за фиксации всех транзакций.
Кроме того, при масштабных изменениях в базе данных накапливаются служебные структуры, о которых часто забывают. Рассмотрим основные скрытые источники разрастания базы:
Прежде чем приступать к сжатию и удалению, выясним причину разрастания. Для этого определим, какие именно таблицы занимают наибольший объем.
Сопоставив имена таблиц СУБД с метаданными 1С (с помощью функции ПолучитьСтруктуруХраненияБазыДанных()), определим, что именно занимает объем: прикрепленные файлы, регистры сведений, таблицы итогов или версионирование.
Рассмотрим комплекс мер по уменьшению объема хранимой информации на стороне прикладного решения:
ХранилищеДополнительнойИнформации на внешний дисковый массив.
ВыборкаУзлов = ПланыОбмена.Полный.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.ЭтотУзел() Тогда
Продолжить;
КонецЕсли;
ПланыОбмена.УдалитьРегистрациюИзменений(ВыборкаУзлов.Ссылка);
КонецЦикла;
После удаления лишней информации из базы данных освободим физическое место на диске с помощью инструментов СУБД. Выполним регламентные процедуры по шагам:
Full переполнение лога .ldf устраняется созданием резервной копии журнала транзакций или временным переводом базы в модель Simple с последующим сжатием файла журнала:
USE [Имя_Базы_Данных];
ALTER DATABASE [Имя_Базы_Данных] SET RECOVERY SIMPLE;
DBCC SHRINKFILE (N'Имя_Файла_Лога' , 1024);
ALTER DATABASE [Имя_Базы_Данных] SET RECOVERY FULL;
.mdf для возврата свободного пространства операционной системе. Обратите внимание: не следует использовать постоянный параметр autoshrink, так как он вызывает циклическую фрагментацию диска.SHRINK перемещает страницы в конец файла, вызывая колоссальную фрагментацию индексов (до 90–99%), что приводит к резкому падению производительности запросов. Запустим процедуру полного перестроения:
USE [Имя_Базы_Данных];
EXEC sp_MSforeachtable @command1="ALTER INDEX ALL ON ? REBUILD WITH (ONLINE = OFF);";
USE [Имя_Базы_Данных];
EXEC sp_updatestats;
Для предотвращения повторного падения производительности и неконтролируемого разрастания файлов проверим параметры экземпляра MS SQL Server:
1, чтобы исключить взаимные блокировки при сложных запросах.