При администрировании высоконагруженных баз данных 1С системные администраторы нередко сталкиваются с ситуацией, когда регламентная дефрагментация (реорганизация) индексов начинает выполняться в разы дольше обычного — вместо 2–3 часов процесс растягивается на 12 и более часов, перекрывая рабочее время и вызывая блокировки при работе пользователей с документами (например, Требование-накладная). При этом полное перестроение (реиндексация) тех же баз завершается штатно за короткий промежуток времени. Разберем детально, почему возникает эта проблема и как правильно выстроить регламентное обслуживание MS SQL Server.
Проанализируем техническую разницу между операциями REORGANIZE (дефрагментация) и REBUILD (перестроение индексов), которая напрямую влияет на длительность регламентных процедур:
ALTER INDEX ... REORGANIZE в MS SQL Server выполняется исключительно в один поток (MAXDOP = 1). Она не способна задействовать несколько процессорных ядер. В то же время перестроение индексов ALTER INDEX ... REBUILD использует параллелизм, за счет чего на мощных многоядерных серверах отрабатывает значительно быстрее, даже выполняя больший физический объем работы.ХранилищеЗначений, присоединенные файлы, длинные строки). Если в базе накопился большой объем файлов или истории версионирования, однопоточная реорганизация таких таблиц создает предельную нагрузку на дисковую систему и процессор.REORGANIZE протоколирует перемещение каждой страницы по отдельности. Если файл журнала транзакций (.ldf) разбит на сотни или тысячи мелких виртуальных лог-файлов (Virtual Log Files — VLF), скорость записи многократно снижается из-за накладных расходов на их переключение.REORGANIZE не обновляет статистику распределения данных. Устаревшая статистика заставляет оптимизатор строить неоптимальные планы запросов (например, полное сканирование таблицы вместо поиска по индексу), что приводит к длительным транзакциям и конфликтам блокировок при открытии и проведении документов в 1С.Рассмотрим, какие метрики необходимо проверить в первую очередь при возникновении зависаний регламентных заданий:
USE [upp];
GO
DBCC LOGINFO;
GO
Если количество возвращенных строк превышает 500–1000, журнал транзакций сильно фрагментирован и требует упорядочивания.
sys.dm_os_waiting_tasks и sys.dm_exec_requests. Ожидания PAGEIOLATCH_* указывают на деградацию дисковой подсистемы, WRITELOG — на задержки записи в файл транзакций, а LCK_* — на блокировки другими процессами.Разберем процедуру приведения журнала транзакций в порядок. Для этого необходимо разово уменьшить файл и выделить ему фиксированный объем с правильным шагом автороста:
USE [upp];
GO
ALTER DATABASE [upp] SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE ([upp_log], 1024);
GO
ALTER DATABASE [upp] SET RECOVERY FULL;
GO
Типовые планы обслуживания (Maintenance Plans) часто запускают дефрагментацию всех индексов подряд, что неэффективно для больших баз 1С. Настроим адаптивное обслуживание на основе следующих правил:
ALTER INDEX ... REORGANIZE;ALTER INDEX ... REBUILD.ONLINE = ON. Это позволяет не блокировать таблицы для пользователей и параллельно работающих регламентных заданий 1С:
ALTER INDEX [ИмяИндекса] ON [dbo].[ИмяТаблицы] REBUILD WITH (ONLINE = ON);
REORGANIZE, обязательно добавляем отдельным шагом обновление статистики по измененным таблицам:
UPDATE STATISTICS [dbo].[ИмяТаблицы] WITH FULLSCAN;
Зависание дефрагментации чаще всего обусловлено однопоточностью операции REORGANIZE, наличием LOB-полей и высокой фрагментацией лога транзакций. Отказ от сплошной дефрагментации в пользу порогового обслуживания, устранение фрагментации VLF и принудительное обновление статистики позволяют сократить время регламентных работ и полностью устранить ошибки блокировок в 1С.