Как решить проблему длительной реструктуризации информационной базы 1С при обновлении?

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

При переходе с устаревших редакций на новые (например, при обновлении 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. В результате постоянных циклов чтения по многомиллионным регистрам скорость работы падает до катастрофического уровня.

Вариант 1. Временный запуск реструктуризации на платформе 8.3.8

Разберем наиболее простой и эффективный обходной путь, не требующий моментального изменения инфраструктуры СУБД:

  1. Выполним резервное копирование информационной базы.
  2. Установим платформу 8.3.8.2442 (или аналогичный релиз ветки 8.3.8).
  3. Запустим обновление конфигурации БД в режиме конфигуратора на платформе 8.3.8. Данная версия платформы не генерирует проблемный запрос проверки регистра бухгалтерии, поэтому реструктуризация проходит без зависаний.
  4. После успешного завершения реструктуризации первый вход в программу и дальнейшую эксплуатацию выполним на целевой платформе (например, 8.3.10 и выше).

Вариант 2. Обновление версии MS SQL Server

Обратим внимание на версию СУБД. Ошибка планировщика запросов MS SQL при обработке данного соединительного запроса исправлена в более свежих релизах СУБД.

Если перенести базу данных на MS SQL Server 2014, 2016 или более новую версию, оптимизатор СУБД корректно строит план выполнения с применением эффективных типов соединения, и реструктуризация завершается за штатное время.

Вариант 3. Предварительное обслуживание MS SQL Server

Если возможности быстро обновить СУБД нет, перед началом реструктуризации разберем комплекс профилактических мер на стороне MS SQL Server:

  1. Обновление статистики: Выполним полное обновление статистики по таблицам регистра с ключом FULLSCAN, чтобы оптимизатор СУБД располагал точными данными: UPDATE STATISTICS dbo._AccRg443 WITH FULLSCAN;
  2. Перевод в простую модель восстановления: На время реструктуризации переведем базу данных в режим SIMPLE recovery model. Это снимет критическую нагрузку с дисковой подсистемы, вызванную записью в журнал транзакций (.ldf).
  3. Включение флагов трассировки: Для исправления ошибок оптимизатора MS SQL Server 2008/2012 включим флаг трассировки 4199: DBCC TRACEON(4199, -1);

Вариант 4. Сворачивание базы данных (свертка)

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

  1. Выполним процедуру сворачивания базы данных на дату начала актуального периода.
  2. Удалим устаревшие и неиспользуемые элементы справочников.
  3. Сокращение количества записей в таблицах регистров позволит провести реструктуризацию значительно быстрее.

Вариант 5. Ручной перенос данных через SQL (для специалистов)

Рассмотрим сценарий обхода реструктуризации для системных администраторов и SQL-экспертов:

  1. Платформа 1С при реструктуризации создает новую таблицу (например, dbo._AccRg443NG) и переносит в неё данные.
  2. Переименуем исходную таблицу dbo._AccRg443 во временное имя.
  3. Создадим пустую таблицу с оригинальным именем dbo._AccRg443 без данных.
  4. Запустим реструктуризацию в конфигураторе — на пустом регистре операция пройдет мгновенно.
  5. На стороне MS SQL Server выполним прямой запрос переноса данных из временной таблицы в реструктурированную целевую таблицу.

Вариант 6. Использование оптимизированной реструктуризации (на платформе 8.3.11+)

Если есть возможность обновить платформу до версии 8.3.11 и выше, задействуем механизм прямой реструктуризации. В этом режиме изменение структуры таблиц выполняется средствами DDL-команд СУБД без полного копирования данных во временные таблицы.

Для активации механизма оптимизированной реструктуризации добавим в файл конфигурации conf.cfg параметр:

UpdateDBCfg=Optimized

Также убедимся, что на сервере «1С:Предприятия» установлена среда выполнения Java (JRE 1.8+).

← На главную