Как исправить фрагментацию и замедление базы 1С в MS SQL Server и правильно настроить перестроение индексов?

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

При работе с крупными информационными базами 1С (например, 1С:Управление производственным предприятием) на СУБД MS SQL Server системные администраторы часто сталкиваются с ситуацией, когда через 1–2 месяца активной эксплуатации база начинает заметно «тормозить». При этом стандартные отчеты MS SQL Server показывают высокий процент фрагментации индексов в ключевых таблицах, а регулярные операции дефрагментации или перестроения либо блокируют пользователей, либо не дают видимого результата. Рассмотрим подробно причины возникновения этой проблемы, разберем влияние фрагментации на скорость работы 1С и сформируем правильный регламент обслуживания базы данных.

Анализ проблемы: Влияет ли фрагментация на производительность 1С?

Проанализируем ситуация с задержками и выясним, что именно происходит на уровне СУБД при активной работе пользователей 1С:

  1. Влияние типа дисков (HDD против SSD/NVMe): На современных серверных накопителях (SSD и NVMe) физическая фрагментация практически не оказывает влияния на скорость выполнения единичных запросов. В отличие от жестких дисков (HDD), где считывающая головка теряет время на позиционирование между разбросанными секторами, SSD-накопители читают произвольные блоки с одинаково высокой скоростью.
  2. Главный источник замедлений — устаревшая статистика: Когда пользователи активно добавляют, изменяют или удаляют документы и движения в 1С, распределение данных в таблицах меняется. Если статистика СУБД устарела, оптимизатор MS SQL Server начинает строить неэффективные планы запросов (например, вместо использования точечного индекса Index Seek выполняется полное сканирование таблицы Table Scan).
  3. Почему перестроение индексов визуально «помогает»: При выполнении команды ALTER INDEX ... REBUILD MS SQL Server по умолчанию автоматически производит полное обновление статистики (с эквивалентом команды UPDATE STATISTICS WITH FULLSCAN) для перестраиваемого индекса. Прирост скорости в 90% случаев дает именно актуализация статистики, а не устранение фрагментации страниц.

Почему процент фрагментации не снижается после REBUILD и REORGANIZE?

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

  1. Маленькие таблицы и индексы: SQL Server принципиально не производит дефрагментацию таблиц и индексов, размер которых менее 1000–2500 страниц (примерно до 8–20 МБ). Для небольших справочников и системных таблиц 1С процент фрагментации в отчетах может составлять 70–90% сразу после перестроения, и это является нормальным стандартом работы оптимизатора.
  2. Использование GUID (Уникальных идентификаторов): В платформе 1С большинство ссылок и уникальных ключей генерируются как случайные значения GUID. При вставке новых записей в произвольные места страниц индекса происходит так называемый Page Split (расщепление страниц). В результате индекс снова фрагментируется на 50–80% буквально за несколько часов работы.

Решение проблемы блокировок: Команда ALTER INDEX REBUILD WITH (ONLINE = ON)

Главная проблема обычного перестроения индексов заключается в том, что процедура блокирует таблицы (в частности, таблицы регистров накопления и сведений), из-за чего пользователи 1С не могут продолжать работу. Чтобы выполнить перестроение в рабочее время без выгона пользователей, разберем применение параметра ONLINE = ON.

Рассмотрим синтаксис выполнения команды перестроения индекса для конкретной таблицы:


-- Перестроение конкретного индекса в режиме онлайн
ALTER INDEX ALL ON dbo._AccumRgT1234
REBUILD WITH (ONLINE = ON);

Или для выполнения реорганизации (которая не блокирует таблицы по своей природе, но требует включенных блокировок на уровне страниц):


-- Реорганизация всех индексов таблицы
ALTER INDEX ALL ON dbo._Document123
REORGANIZE;

Ограничения и важные нюансы режима ONLINE = ON

Перед внедрением онлайн-перестроения в регламентные задания проанализируем имеющиеся технические ограничения:

  1. Редакция MS SQL Server: Опция WITH (ONLINE = ON) доступна исключительно в редакциях Enterprise или Developer. В редакции Standard Edition запуск этой команды приведет к синтаксической ошибке.
  2. Типы данных LOB (Large Objects): В MS SQL Server 2014 онлайн-перестроение не поддерживается для таблиц, содержащих типы данных LOB (nvarchar(max), varbinary(max), image, text). Некоторые таблицы 1С (хранилища настроек, прикрепленные файлы, текстовые поля) содержат эти типы, поэтому для них ONLINE REBUILD завершится ошибкой.
  3. Блокировка ALLOW_PAGE_LOCKS в новых платформах 1С (8.3.22+): Начиная с версии 8.3.22, платформа 1С может принудительно отключать блокировки страниц (ALLOW_PAGE_LOCKS = OFF). В этом случае операция REORGANIZE вернет ошибку. Для решения этой проблемы перед реорганизацией требуется на время включать параметр:

-- Включение блокировок страниц перед реорганизацией
ALTER INDEX ALL ON dbo._AccumRgT1234 
SET (ALLOW_PAGE_LOCKS = ON);

-- Выполнение реорганизации
ALTER INDEX ALL ON dbo._AccumRgT1234 REORGANIZE;

-- Возврат параметра в исходное состояние
ALTER INDEX ALL ON dbo._AccumRgT1234 
SET (ALLOW_PAGE_LOCKS = OFF);

Оптимальный регламент обслуживания базы 1С на MS SQL Server

Чтобы обеспечить максимальную производительность 1С и исключить зависания системы, сформируем правильный регулярный сценарий обслуживания:

  1. Регулярное обновление статистики (Ежедневно / несколько раз в день):

    Вместо ресурсоемкого и опасного блокировками перестроения индексов настройте регулярный запуск обновления статистики с максимальной точностью. Это процедура занимает считанные минуты и устраняет большинство причин замедления запросов.

    
    -- Обновление статистики для всей базы данных с полным сканированием
    EXEC sp_MSforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN';
    

    Для конкретной таблицы 1С используйте:

    UPDATE STATISTICS dbo._AccumRg1234 WITH FULLSCAN;
  2. Настройка параметра FILLFACTOR (Коэффициент заполнения страниц):

    Для интенсивно изменяемых таблиц 1С рекомендуем установить параметр FILLFACTOR на уровень 80–90%. Это оставляет свободное место на страницах индекса для новых записей, предотвращая частое расщепление страниц (Page Split).

    
    -- Перестроение индекса с установкой FILLFACTOR 85%
    ALTER INDEX ALL ON dbo._AccumRg1234 
    REBUILD WITH (FILLFACTOR = 85, ONLINE = ON);
    
  3. Настройка параметров сервера MS SQL для работы с 1С:

    Проверим ключевые системные настройки MS SQL Server, влияющие на параллелизм и распределение ресурсов:

    • MAXDOP (Max Degree of Parallelism): Для серверных баз 1С рекомендуется устанавливать значение 1 (на многоядерных высоконагруженных системах — не более 2–4), чтобы избежать некорректного параллельного выполнения сложных запросов 1С.
    • Cost Threshold for Parallelism: Поднимите значение с дефолтных 5 до 50, чтобы мелкие запросы не тратили ресурсы на организацию параллельных потоков.

Подводя итоги: замедления 1С через длительное время работы обычно вызваны устареванием статистики, а не самой фрагментацией. Внедрение регулярного обновления статистики UPDATE STATISTICS WITH FULLSCAN в сочетании с перестроением индексов через ONLINE = ON в технологическое окно позволит поддерживать стабильно высокую скорость работы системы без блокировки пользователей.

← На главную