Когда и как использовать DBCC FREEPROCCACHE и FLUSHPROCINDB для оптимизации 1С

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

В работе системного администратора и разработчика 1С часто возникает ситуация, когда производительность системы внезапно падает без видимых причин. Документы, которые обычно проводятся за секунды, начинают «висеть» минутами, а нагрузка на сервер растет. Одним из инструментов оперативного реагирования в таких случаях является очистка процедурного кэша SQL Server. В этой статье мы подробно разберем, как работают команды FREEPROCCACHE и FLUSHPROCINDB, когда их стоит применять и почему это решение часто называют «атомной бомбой» для сервера.

Понятие процедурного кэша и причины его очистки

Проанализируем сначала, что именно мы очищаем. SQL Server сохраняет планы выполнения запросов в специальной области памяти — процедурном кэше. Это делается для того, чтобы при повторном выполнении того же запроса сервер не тратил ресурсы на построение оптимального пути доступа к данным. Однако в среде 1С часто возникает проблема Parameter Sniffing. Это ситуация, когда SQL Server строит план выполнения на основе первого переданного параметра (например, выборка по пустой ссылке или по очень редкому значению), и этот план оказывается крайне неэффективным для всех последующих вызовов с другими параметрами.

Рассмотрим основные команды, которые используются для решения этой проблемы:

  1. DBCC FREEPROCCACHE — это глобальная команда, которая полностью очищает кэш планов для всего экземпляра SQL Server. Ее использование на нагруженном сервере с множеством баз данных крайне нежелательно, так как это заставляет сервер перекомпилировать абсолютно все запросы.
  2. DBCC FLUSHPROCINDB(db_id) — более мягкий, хотя и недокументированный вариант. Эта команда очищает кэш планов только для конкретной базы данных. Это особенно актуально, когда на одном сервере крутится 10–20 баз, а тормозит только одна.

Разберем сценарий использования FLUSHPROCINDB

Выясним причину, почему системные администраторы часто прибегают к этой недокументированной команде. Как было отмечено в обсуждении, FLUSHPROCINDB требует идентификатор базы данных. Посмотрим на пример кода, который можно использовать в SQL Management Studio или в задании SQL Agent:


DECLARE @DBID INT;
SET @DBID = DB_ID('Имя_Вашей_Базы');
DBCC FLUSHPROCINDB(@DBID);

Важно помнить, что напрямую передать функцию DB_ID() в команду DBCC нельзя — синтаксис SQL Server этого не позволяет. Сначала необходимо получить идентификатор в переменную, как показано в примере выше.

Связь очистки кэша с регламентными операциями

Проанализируем ситуацию, когда очистка кэша становится частью регламента. В официальных рекомендациях 1С (на портале ИТС) указывается, что после обновления статистики (UPDATE STATISTICS) крайне желательно сбрасывать кэш планов. Почему это важно?

Если мы обновили статистику, SQL Server теперь знает актуальное распределение данных в таблицах. Однако в кэше могут оставаться старые планы, построенные на основе «кривой» статистики. Очистка кэша заставляет сервер перестроить планы, используя уже новые, точные данные.

Рассмотрим взаимосвязь с индексами:

Следовательно, если ваш ночной регламент включает только реорганизацию, вам обязательно нужно отдельно запускать обновление статистики и последующую очистку кэша.

Риски и побочные эффекты: «Компиляционный шторм»

Необходимо понимать, почему опытные администраторы баз данных предостерегают от частого использования этих команд. Представим ситуацию: в системе работают сотни пользователей, генерирующих тысячи запросов в секунду. В момент выполнения FREEPROCCACHE все эти запросы мгновенно лишаются готовых планов.

Проанализируем последствия:

  1. Скачок нагрузки на CPU: Процессор начинает интенсивно вычислять новые планы для каждого входящего запроса.
  2. Ожидания на компиляцию: Появляются специфические типы ожиданий (например, RESOURCE_SEMAPHORE_QUERY_COMPILE), когда запросы выстраиваются в очередь просто для того, чтобы их «скомпилировали».
  3. Блокировки: В процессе генерации планов могут возникать кратковременные блокировки на системных таблицах.

Это и называется «компиляционным штормом». Вместо ускорения работы вы можете получить полную остановку системы на несколько минут.

Современные альтернативы (SQL Server 2016 и выше)

Если вы используете современные версии SQL Server, у нас есть гораздо более элегантные способы управления кэшем. Рассмотрим их подробнее.

1. Очистка кэша на уровне базы (документированная)

Вместо использования недокументированной команды FLUSHPROCINDB, в SQL Server 2016 появилась официальная инструкция:

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

Она безопасна, поддерживается Microsoft и делает именно то, что нам нужно — очищает кэш только текущей базы данных.

2. Использование Query Store

Это, пожалуй, самый мощный инструмент. Вместо того чтобы «бомбить» весь кэш, мы можем проанализировать Query Store, найти конкретный запрос, который деградировал из-за плохого плана, и «принудительно» (Force Plan) закрепить за ним хороший план. Это решает проблему точечно, не затрагивая остальные процессы.

3. Удаление конкретного плана

Если мы знаем plan_handle проблемного запроса, мы можем удалить из кэша только его:

DBCC FREEPROCCACHE (0x060006001ECA29044021AD05000000000000000000000000);

Это требует определенных навыков мониторинга, но является «тру-способом» администрирования.

Выводы и рекомендации

Подводя итог, ответим на вопрос: стоит ли использовать очистку кэша регулярно?

Рассмотрим правильную стратегию:

  1. Использование FREEPROCCACHE в ежедневных заданиях оправдано только в ночное время, сразу после выполнения операций UPDATE STATISTICS.
  2. В дневное время при возникновении «тормозов» лучше использовать ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE (для новых версий SQL) или FLUSHPROCINDB (для старых), но только как экстренную меру.
  3. Постарайтесь выявить конкретный запрос, вызывающий проблемы. В 1С это часто сложные отчеты или запросы с использованием временных таблиц.
  4. Если база данных велика (сотни гигабайт), обеспечьте сервер достаточным объемом оперативной памяти. Однако помните, что даже терабайты RAM не спасут от плохого плана выполнения запроса, возникшего из-за Parameter Sniffing.

Таким образом, очистка кэша — это мощный, но опасный инструмент. Используйте его осознанно, понимая структуру своего регламентного обслуживания и версию используемого SQL-сервера.

← На главную