При работе с крупными информационными базами 1С (например, 1С:Управление производственным предприятием) на СУБД MS SQL Server системные администраторы часто сталкиваются с ситуацией, когда через 1–2 месяца активной эксплуатации база начинает заметно «тормозить». При этом стандартные отчеты MS SQL Server показывают высокий процент фрагментации индексов в ключевых таблицах, а регулярные операции дефрагментации или перестроения либо блокируют пользователей, либо не дают видимого результата. Рассмотрим подробно причины возникновения этой проблемы, разберем влияние фрагментации на скорость работы 1С и сформируем правильный регламент обслуживания базы данных.
Проанализируем ситуация с задержками и выясним, что именно происходит на уровне СУБД при активной работе пользователей 1С:
Index Seek выполняется полное сканирование таблицы Table Scan).ALTER INDEX ... REBUILD MS SQL Server по умолчанию автоматически производит полное обновление статистики (с эквивалентом команды UPDATE STATISTICS WITH FULLSCAN) для перестраиваемого индекса. Прирост скорости в 90% случаев дает именно актуализация статистики, а не устранение фрагментации страниц.Выясним, почему даже после запуска процедур обслуживания отчеты SQL Server продолжают показывать высокую фрагментацию:
Page Split (расщепление страниц). В результате индекс снова фрагментируется на 50–80% буквально за несколько часов работы.Главная проблема обычного перестроения индексов заключается в том, что процедура блокирует таблицы (в частности, таблицы регистров накопления и сведений), из-за чего пользователи 1С не могут продолжать работу. Чтобы выполнить перестроение в рабочее время без выгона пользователей, разберем применение параметра ONLINE = ON.
Рассмотрим синтаксис выполнения команды перестроения индекса для конкретной таблицы:
-- Перестроение конкретного индекса в режиме онлайн
ALTER INDEX ALL ON dbo._AccumRgT1234
REBUILD WITH (ONLINE = ON);
Или для выполнения реорганизации (которая не блокирует таблицы по своей природе, но требует включенных блокировок на уровне страниц):
-- Реорганизация всех индексов таблицы
ALTER INDEX ALL ON dbo._Document123
REORGANIZE;
Перед внедрением онлайн-перестроения в регламентные задания проанализируем имеющиеся технические ограничения:
WITH (ONLINE = ON) доступна исключительно в редакциях Enterprise или Developer. В редакции Standard Edition запуск этой команды приведет к синтаксической ошибке.nvarchar(max), varbinary(max), image, text). Некоторые таблицы 1С (хранилища настроек, прикрепленные файлы, текстовые поля) содержат эти типы, поэтому для них ONLINE REBUILD завершится ошибкой.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С и исключить зависания системы, сформируем правильный регулярный сценарий обслуживания:
Вместо ресурсоемкого и опасного блокировками перестроения индексов настройте регулярный запуск обновления статистики с максимальной точностью. Это процедура занимает считанные минуты и устраняет большинство причин замедления запросов.
-- Обновление статистики для всей базы данных с полным сканированием
EXEC sp_MSforeachtable 'UPDATE STATISTICS ? WITH FULLSCAN';
Для конкретной таблицы 1С используйте:
UPDATE STATISTICS dbo._AccumRg1234 WITH FULLSCAN;
Для интенсивно изменяемых таблиц 1С рекомендуем установить параметр FILLFACTOR на уровень 80–90%. Это оставляет свободное место на страницах индекса для новых записей, предотвращая частое расщепление страниц (Page Split).
-- Перестроение индекса с установкой FILLFACTOR 85%
ALTER INDEX ALL ON dbo._AccumRg1234
REBUILD WITH (FILLFACTOR = 85, ONLINE = ON);
Проверим ключевые системные настройки MS SQL Server, влияющие на параллелизм и распределение ресурсов:
1 (на многоядерных высоконагруженных системах — не более 2–4), чтобы избежать некорректного параллельного выполнения сложных запросов 1С.5 до 50, чтобы мелкие запросы не тратили ресурсы на организацию параллельных потоков.Подводя итоги: замедления 1С через длительное время работы обычно вызваны устареванием статистики, а не самой фрагментацией. Внедрение регулярного обновления статистики UPDATE STATISTICS WITH FULLSCAN в сочетании с перестроением индексов через ONLINE = ON в технологическое окно позволит поддерживать стабильно высокую скорость работы системы без блокировки пользователей.