Работа с крупными базами данных (объемом более 1 Тб) на платформе 1С:Предприятие 8.3 требует особого внимания к обслуживанию MS SQL Server. Одной из критических проблем, с которой могут столкнуться администраторы и разработчики, является «замирание» процесса пересчета итогов. В этой статье мы подробно разберем ситуацию, когда дата рассчитанных итогов не двигается вперед, проанализируем причины возникновения этой проблемы и рассмотрим пошаговые методы ее решения на основе реального опыта и технических практик.
Рассмотрим типичный сценарий: для проведения регламентных работ была сброшена дата итогов. При попытке вернуть ее на текущий момент процесс доходит до определенной даты (например, конца года) и останавливается. При этом в консоли администрирования серверов 1С наблюдается рост показателя Захвачено СУБД, а в диспетчере задач SQL Server потребляет ресурсы, но прогресса нет в течение многих суток.
Первым делом проанализируем состояние процессов внутри SQL Server. Для этого выполним запрос, который покажет нам активные процессы и типы их ожиданий:
SELECT * FROM master.dbo.sysprocesses
WHERE spid > 50 AND status = 'runnable';
Если мы обнаружим ожидание типа SOS_SCHEDULER_YIELD, это явный сигнал. Данный тип ожидания означает, что процесс исчерпал свой квант времени на процессоре и добровольно уступил место другим потокам, ожидая повторного включения в очередь планировщика. В контексте пересчета итогов 1С это часто свидетельствует о том, что SQL Server строит крайне неоптимальный план выполнения запроса из-за неактуальной статистики.
В крупных базах стандартное регламентное задание по обновлению статистики часто выполняется в режиме SAMPLE (выборочно), чтобы сэкономить время. Однако для таблиц итогов регистров бухгалтерии, где количество записей исчисляется сотнями миллионов, выборки в 10-20% может быть недостаточно для корректной работы оптимизатора запросов.
Рассмотрим по шагам, как выполнить полное обновление статистики:
ПолучитьСтруктуруХраненияБазыДанных._AccRgAT0, _AccRgAT1, _AccRgOpt и т.д.).FULLSCAN для этих таблиц.Пример кода на стороне 1С для получения имен таблиц:
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить("РегистрБухгалтерии.Хозрасчетный");
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных(МассивОбъектов, Истина);
// Далее перебираем ТаблицаСтруктуры и ищем ИмяТаблицыХранения
После получения имен таблиц (например, _AccRg16395), выполним SQL-скрипт:
UPDATE STATISTICS _AccRg16395 WITH FULLSCAN;
UPDATE STATISTICS _AccRgOpt16447 WITH FULLSCAN;
-- Повторить для всех таблиц итогов данного регистра
Проанализируем результат: полное обновление статистики позволяет SQL Server увидеть реальное распределение данных. Как показывает практика, после этой процедуры процесс пересчета итогов, который висел неделю, может завершиться за несколько часов или даже минут.
Часто причиной ожидания SOS_SCHEDULER_YIELD является избыточный параллелизм. Когда SQL Server пытается разбить тяжелый запрос по пересчету итогов на 32 или 64 ядра, накладные расходы на координацию этих потоков становятся выше, чем профит от параллельного выполнения. Для баз 1С крайне рекомендуется ограничить этот параметр.
Как проверить и настроить:
Max Degree of Parallelism.Cost Threshold for Parallelism — для 1С рекомендуется устанавливать значение не менее 50.Эти настройки заставят SQL Server использовать ресурсы более эффективно, не «распыляясь» на чрезмерное количество потоков при расчете итогов.
Пересчет итогов в базе 1.8 Тб создает колоссальную нагрузку на дисковую подсистему и системные базы данных. Выясним, не является ли «бутылочным горлышком» конфигурация файлов.
Проанализируем следующие моменты:
Simple. Это предотвратит бесконечный рост файла лога транзакций (.ldf), который при переполнении диска просто остановит процесс пересчета.tempdb. Убедитесь, что tempdb вынесена на самые быстрые диски (NVMe/SSD) и имеет достаточное количество файлов (равное количеству ядер процессора, но не более 8).Detach/Attach базы, чтобы сбросить часть внутренних кэшей планировщика.В настройках регистров 1С существует свойство Разделение итогов. Оно позволяет записывать данные в несколько физических таблиц (таблицы с суффиксом _T), чтобы избежать блокировок. Однако при глобальном пересчете итогов на огромных объемах это может замедлить процесс.
Если пересчет не идет, попробуем следующий алгоритм:
Если итоги всегда останавливаются на одной и той же дате (например, 31.12.2016), нельзя исключать повреждение данных на уровне страниц SQL. Проанализируем состояние таблиц командой DBCC CHECKTABLE. Используя имена таблиц, полученные ранее, выполним:
DBCC CHECKTABLE ('_AccRg16395');
Если команда выявит ошибки, потребуется восстановление из бэкапа или использование средств исправления ошибок SQL Server, так как обычное «Тестирование и исправление» в 1С может просто зависнуть на поврежденном участке.
Подводя итог, можно сказать, что в 90% случаев проблема зависания пересчета итогов на крупных базах решается именно полным обновлением статистики (FULLSCAN) по конкретным таблицам регистра бухгалтерии. Если база большая, не делайте обновление по всей базе — это может занять сутки. Фокусируйтесь на целевых таблицах.
Ваш чек-лист при зависании итогов:
SOS_SCHEDULER_YIELD).UPDATE STATISTICS ... WITH FULLSCAN для этих таблиц.MAXDOP (рекомендуется 1 для таких операций).Simple модель на время расчета.Соблюдение этих шагов позволит вам успешно завершить пересчет итогов даже в самых тяжелых и запущенных случаях, вернув системе былую производительность.