Ситуация, когда расчет себестоимости в 1С:ERP «съедает» всё доступное место в tempdb, является классической проблемой высоконагруженных систем. Даже существенное увеличение дискового пространства часто дает лишь временный эффект. Давайте разберем, как локализовать причину и какие шаги предпринять для исправления ситуации.
Первым делом нам необходимо выяснить, какой именно запрос провоцирует лавинообразный рост временных таблиц. Не стоит надеяться на удачу — нужно приступать к сбору данных.
tempdb, используйте инструменты мониторинга (SQL Server Management Studio или штатные средства мониторинга 1С), чтобы выявить TOP-5 запросов по чтению/записи в системную базу данных.Hash Match и Sort. Если в плане запроса вы видите, что SQL Server постоянно сбрасывает данные в tempdb (TempDB Spool), значит, запрос составлен неоптимально для текущего объема данных.Иногда причина кроется в неочевидных моментах, например, в способе получения данных из периодических регистров.
Рассмотрим распространенный пример: получение среза последних для соединений с курсами валют или ценами. Если вы соединяете таблицу движений сразу с функцией получения среза, SQL может тратить колоссальные ресурсы на вычисление. Попробуйте разбить запрос на этапы:
Такой подход позволяет серверу работать с меньшими объемами данных на каждой итерации, что радикально снижает нагрузку на tempdb.
Даже оптимизированный код может пасовать перед неверно настроенным экземпляром SQL Server. Разберем критические параметры:
tempdb разбит на несколько файлов данных. Рекомендуется создавать их по количеству логических ядер процессора (до 8 штук). Важно, чтобы все файлы имели абсолютно одинаковый начальный размер и шаг авторасширения. Это предотвращает конкуренцию за страницы распределения (PAGELATCH_UP).Поскольку в вашем случае используется «Бит.Финанс», нельзя исключать влияние стороннего кода. Посмотрите, не запускаются ли регламентные задания «Бит.Финанса» параллельно с расчетом себестоимости. Конкуренция за таблицы может приводить к блокировкам, из-за которых расчет себестоимости становится «бесконечным», а временные таблицы в tempdb растут до исчерпания места.
Попробуйте временно ограничить расписание других фоновых заданий на период закрытия месяца. Это позволит изолировать влияние основной конфигурации и точно понять, в каком именно процессе происходит затык.
Если после всех оптимизаций расчет по-прежнему падает, стоит проанализировать настройки параллелизма (MAXDOP). Если сервер выполняет множество задач, попробуйте ограничить MAXDOP значением от 4 до 8. Это уменьшит количество параллельных потоков, каждый из которых требует свой кусок памяти и места в tempdb.
Также рекомендуется использовать Query Store (в SQL Server 2016+), чтобы увидеть, не произошел ли «регресс плана запроса». Часто бывает, что раньше отчет работал быстро, а после изменения объема данных (например, добавления записей за новый месяц) сервер начал выбирать другой, менее эффективный план выполнения для тех же самых запросов.
Помните: работа с tempdb — это всегда поиск баланса между эффективностью алгоритма и аппаратными ресурсами. Начните с анализа запросов, оптимизируйте работу с временными таблицами, и вы увидите, что стабильность системы заметно возрастет.