При переходе с устаревших редакций на новые (например, при обновлении 1С:Бухгалтерии 2.0 на 3.0) или при обновлении больших конфигураций на платформе 1С:Предприятие 8.3 специалисты часто сталкиваются со сверхдолгой или "зависающей" реструктуризацией. СУБД MS SQL Server начинает выполняться технический запрос проверки целостности таблиц регистра бухгалтерии или регистров накопления, зависая на несколько суток.
Проанализируем причины возникновения этой проблемы и подробно разберем проверенные практические варианты её решения.
Рассмотрим, почему происходит зависание. Начиная с определенных релизов платформы (в частности, 8.3.10), по завершении изменения структуры таблиц регистра бухгалтерии и регистров накопления платформа 1С генерирует служебный запрос вида:
SELECT TOP 1 T1._RecorderTRef, T1._RecorderRRef
FROM dbo._AccRgED479NG T1 WITH(NOLOCK)
LEFT OUTER JOIN dbo._AccRg443NG T2 WITH(NOLOCK)
ON T1._RecorderTRef = T2._RecorderTRef
AND T1._RecorderRRef = T2._RecorderRRef
AND T1._LineNo = T2._LineNo
WHERE T2._RecorderTRef IS NULL
AND T2._RecorderRRef IS NULL
При выполнении этого запроса в устаревших версиях СУБД (MS SQL Server 2008 R2 и SQL Server 2012) оптимизатор запросов СУБД неверно оценивает размер ведущего потока и выбирает неподходящий соединительный алгоритм Nested Loops (вложенные циклы) вместо Hash Match или Merge Join. В результате постоянных циклов чтения по многомиллионным регистрам скорость работы падает до катастрофического уровня.
Разберем наиболее простой и эффективный обходной путь, не требующий моментального изменения инфраструктуры СУБД:
8.3.8.2442 (или аналогичный релиз ветки 8.3.8).8.3.8. Данная версия платформы не генерирует проблемный запрос проверки регистра бухгалтерии, поэтому реструктуризация проходит без зависаний.8.3.10 и выше).Обратим внимание на версию СУБД. Ошибка планировщика запросов MS SQL при обработке данного соединительного запроса исправлена в более свежих релизах СУБД.
Если перенести базу данных на MS SQL Server 2014, 2016 или более новую версию, оптимизатор СУБД корректно строит план выполнения с применением эффективных типов соединения, и реструктуризация завершается за штатное время.
Если возможности быстро обновить СУБД нет, перед началом реструктуризации разберем комплекс профилактических мер на стороне MS SQL Server:
FULLSCAN, чтобы оптимизатор СУБД располагал точными данными:
UPDATE STATISTICS dbo._AccRg443 WITH FULLSCAN;
SIMPLE recovery model. Это снимет критическую нагрузку с дисковой подсистемы, вызванную записью в журнал транзакций (.ldf).
DBCC TRACEON(4199, -1);
Проанализируем объем данных. Если регистр бухгалтерии содержит десятки миллионов записей за прошлые периоды, которые не требуются в новой редакции конфигурации, оптимальным решением станет свертка информационной базы.
Рассмотрим сценарий обхода реструктуризации для системных администраторов и SQL-экспертов:
dbo._AccRg443NG) и переносит в неё данные.dbo._AccRg443 во временное имя.dbo._AccRg443 без данных.Если есть возможность обновить платформу до версии 8.3.11 и выше, задействуем механизм прямой реструктуризации. В этом режиме изменение структуры таблиц выполняется средствами DDL-команд СУБД без полного копирования данных во временные таблицы.
Для активации механизма оптимизированной реструктуризации добавим в файл конфигурации conf.cfg параметр:
UpdateDBCfg=Optimized
Также убедимся, что на сервере «1С:Предприятия» установлена среда выполнения Java (JRE 1.8+).