При сопровождении баз данных 1С на платформе MS SQL Server системные администраторы нередко сталкиваются с ситуацией, когда регламентная операция «Проверка целостности базы данных» (DBCC CHECKDB) начинает выполняться значительно дольше обычного (например, время выполнения возрастает с 30 минут до полутора часов и более), хотя видимого лавинообразного роста объема данных не происходило.
Разберем детально, как устроена процедура проверки целостности, какие скрытые факторы приводят к падению производительности и как оптимизировать регламентные процедуры обслуживания базы данных.
Для обеспечения транзакционной согласованности без блокировки всей рабочей базы DBCC CHECKDB по умолчанию создает внутренний скрытый моментальный снимок базы данных (Database Snapshot) на основе разреженных файлов (Sparse Files) на том же логическом диске, где расположены основные файлы данных (MDF/NDF). Проанализируем основные факторы замедления:
TempDB. Если TempDB медленный или не настроен, операция резко деградирует по скорости.Write-Back в медленный Write-Through, что снижает скорость случайной записи в разы.CXPACKET.Проанализируем текущее состояние базы данных. Регулярная высокая фрагментация свидетельствует о неоптимальных параметрах автороста файлов или отсутствии корректного расписания обслуживания.
Для оценки фрагментации индексов используем системное динамическое представление:
SELECT *
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED')
WHERE avg_fragmentation_in_percent > 30;
Обратим внимание на критически важные параметры базы данных в SQL Server Management Studio (SSMS):
Auto Shrink = False). Включение автосжатия приводит к постоянному циклу «расширение-сжатие-фрагментация», разрушающему файловую систему.Рассмотрим альтернативные режимы вызова команды DBCC CHECKDB, позволяющие уложиться в технологическое окно обслуживания.
Вариант А. Проверка только физической структуры (PHYSICAL_ONLY)
Параметр PHYSICAL_ONLY проверяет целостность физической структуры страниц, заголовков и дискового распределения, пропуская ресурсоемкие логические проверки таблиц и индексов. Это снижает нагрузку на дисковую подсистему и процессор на 60–80%:
DBCC CHECKDB (N'ИмяБазы1С', NO_INFOMSGS) WITH PHYSICAL_ONLY;
Вариант Б. Проверка без анализа некластеризованных индексов (NOINDEX)
Если требуется выполнить базовую логическую проверку самих таблиц, но сэкономить время на индексах, используем параметр NOINDEX:
DBCC CHECKDB (N'ИмяБазы1С', NOINDEX) WITH NO_INFOMSGS;
Выстроим правильную последовательность ночных регламентных процедур, чтобы задачи не конкурировали друг с другом за дисковые ресурсы:
WITH PHYSICAL_ONLY ежедневно, полная глубокая проверка — 1 раз в неделю в выходной день.UPDATE STATISTICS ... WITH FULLSCAN) после перестроения индексов.WITH COMPRESSION) в отдельное дисковое хранилище.Поскольку DBCC CHECKDB активно задействует временную базу, выполним базовые настройки TempDB:
TempDB на самом быстром доступном накопителе (отдельный массив NVMe/SSD).TempDB (обычно по числу физических ядер процессора, но не более 8 файлов) с одинаковым начальным размером и одинаковым шагом автороста.TempDB, чтобы исключить динамическое расширение файлов во время ночных регламентов.Если база данных превышает несколько терабайт и даже оптимизированная проверка не укладывается в отведенное технологическое окно, наиболее надежным решением является вынос проверки на тестовый сервер: ежедневный бэкап автоматически разворачивается на резервной виртуальной машине, где команда DBCC CHECKDB выполняется без влияния на рабочий процесс предприятия.