Почему увеличилось время проверки целостности базы данных MS SQL и как его сократить?

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

При сопровождении баз данных 1С на платформе MS SQL Server системные администраторы нередко сталкиваются с ситуацией, когда регламентная операция «Проверка целостности базы данных» (DBCC CHECKDB) начинает выполняться значительно дольше обычного (например, время выполнения возрастает с 30 минут до полутора часов и более), хотя видимого лавинообразного роста объема данных не происходило.

Разберем детально, как устроена процедура проверки целостности, какие скрытые факторы приводят к падению производительности и как оптимизировать регламентные процедуры обслуживания базы данных.

1. Как работает DBCC CHECKDB и почему падает скорость

Для обеспечения транзакционной согласованности без блокировки всей рабочей базы DBCC CHECKDB по умолчанию создает внутренний скрытый моментальный снимок базы данных (Database Snapshot) на основе разреженных файлов (Sparse Files) на том же логическом диске, где расположены основные файлы данных (MDF/NDF). Проанализируем основные факторы замедления:

  1. Активная запись в базу во время проверки. Если во время работы регламента выполняются фоновые задания 1С или пользователи совершают запись, механизм Copy-on-Write копирует исходные страницы данных в теневой снимок. Это создает повышенную нагрузку на дисковую подсистему и фрагментирует разреженные файлы.
  2. Сброс структур в базу TempDB (Spill to TempDB). Для отслеживания связей и построения служебных структур команда требует значительный объем оперативной памяти. При нехватке памяти (Memory Grant) данные сбрасываются в TempDB. Если TempDB медленный или не настроен, операция резко деградирует по скорости.
  3. Проблемы кэша дискового массива. При разрядке батареи резервного питания RAID-контроллера (BBU) дисковый контроллер может незаметно переключиться из режима Write-Back в медленный Write-Through, что снижает скорость случайной записи в разы.
  4. Параметры многопоточности (MAXDOP). Проверка выполняется параллельно. Высокая конкуренция за ядра процессора или неоптимальные настройки параллелизма могут вызывать чрезмерные ожидания CXPACKET.

2. Проверка фрагментации индексов и базовых параметров базы данных

Проанализируем текущее состояние базы данных. Регулярная высокая фрагментация свидетельствует о неоптимальных параметрах автороста файлов или отсутствии корректного расписания обслуживания.

Для оценки фрагментации индексов используем системное динамическое представление:


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):

  1. Параметр автороста файлов (Auto-growth). Значения по умолчанию (1 МБ) приводят к тысячам мелких фрагментов файла данных и постоянным блокировкам при расширении. Для баз объемом сотни гигабайт рекомендуется задавать фиксированный прирост (например, от 1024 МБ до 2048 МБ) либо процентный шаг (3–5%).
  2. Параметр Auto Shrink. Убедимся, что автоматическое сжатие отключено (Auto Shrink = False). Включение автосжатия приводит к постоянному циклу «расширение-сжатие-фрагментация», разрушающему файловую систему.
  3. Ограничение оперативной памяти сервера (Server Max Memory). Зададим максимальный объем памяти для SQL Server на уровне 80–85% от физической памяти сервера, оставив 15–20% для операционной системы, процессов кластера 1С и служебных нужд.

3. Способы ускорения проверки целостности

Рассмотрим альтернативные режимы вызова команды 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;

4. Рекомендуемый регламент обслуживания базы 1С

Выстроим правильную последовательность ночных регламентных процедур, чтобы задачи не конкурировали друг с другом за дисковые ресурсы:

  1. Проверка целостности базы данных: легкая проверка WITH PHYSICAL_ONLY ежедневно, полная глубокая проверка — 1 раз в неделю в выходной день.
  2. Обслуживание индексов: дефрагментация (Reorganize) при фрагментации от 10% до 30%, перестроение (Rebuild) при фрагментации выше 30%.
  3. Обновление статистик: полное обновление статистик (UPDATE STATISTICS ... WITH FULLSCAN) после перестроения индексов.
  4. Очистка процедурного кэша: очистка плана запросов для применения обновленной статистики.
  5. Создание полной резервной копии (Full Backup): создание бэкапа в сжатом виде (WITH COMPRESSION) в отдельное дисковое хранилище.
  6. Резервное копирование журнала транзакций (Log Backup): регулярное архивирование журнала каждые 10–30 минут в течение рабочего дня.

5. Оптимизация системной базы TempDB

Поскольку DBCC CHECKDB активно задействует временную базу, выполним базовые настройки TempDB:

  1. Разместим файлы TempDB на самом быстром доступном накопителе (отдельный массив NVMe/SSD).
  2. Создадим несколько файлов данных TempDB (обычно по числу физических ядер процессора, но не более 8 файлов) с одинаковым начальным размером и одинаковым шагом автороста.
  3. Зададим достаточный начальный объем файлов TempDB, чтобы исключить динамическое расширение файлов во время ночных регламентов.

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

← На главную