Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MSSQL 8645 1С:Предприятие и СУБД

MSSQL Ошибка 8645: A timeout occurred while waiting for memory resources

Обновлено: 25.08.2026 · Официальная документация ↗
  • Запросы падают по таймауту: Msg 8645, Level 17, State 1: A timeout occurred while waiting for memory resources to execute the query in resource pool 'default'.
  • В мониторинге фиксируются массовые ожидания RESOURCE_SEMAPHORE.
  • Зависание сессий пользователей 1С:Предприятие при построении тяжелых отчетов или выполнении групповой обработки данных.
  • Значение показателя Target Server Memory равно Total Server Memory, память сервера утилизирована на 100%.

1. Мониторинг ожиданий выделения памяти (Memory Grants Pending)

-- Просмотр запросов, ожидающих выделения памяти прямо сейчас
SELECT 
    r.session_id,
    r.status,
    r.wait_type,
    r.wait_time,
    mg.requested_memory_kb,
    mg.granted_memory_kb,
    mg.required_memory_kb,
    t.text AS sql_text
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_query_memory_grants mg ON r.session_id = mg.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.wait_type = 'RESOURCE_SEMAPHORE';

2. Анализ и ограничение максимального Memory Grant

Один неоптимальный запрос может захватить до 25% всей памяти SQL Server для операций сортировки (SORT) и хеширования (HASH JOIN):

-- Настройка Resource Governor для ограничения максимального объема памяти на запрос
ALTER WORKLOAD GROUP [default]
WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 10); -- максимум 10% от пула на один запрос
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO

3. Оптимизация неверных оценок Cardinality Estimation

Если оптимизатор ошибочно предполагает выборку 10 млн строк вместо 10, он резервирует гигантский Memory Grant. Обновите статистику:

UPDATE STATISTICS dbo._DocumentJournal WITH FULLSCAN;

4. Корректировка системного таймаута ожидания памяти (query wait)

-- Увеличение времени ожидания выделения памяти (в секундах, по умолчанию -1: 3 * estimated_cost)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'query wait (s)', 60;
RECONFIGURE;
💡 Практика специалистов: Используйте Extended Events с событием query_memory_grant_usage для выявления запросов с высоким расхождением между Granted Memory и Used Memory (когда резервируется 8GB, а реально используется 10MB).

Частые вопросы (FAQ)

Что такое RESOURCE_SEMAPHORE в SQL Server?

Это тип ожидания ядра СУБД, сигнализирующий о том, что запрос не может начать выполнение, так как для его операций Sort/Hash Join не хватает свободного рабочего пространства в буфере Memory Grant.

Почему добавление физической памяти не всегда решает ошибку 8645?

Если в системе запускается одновременно несколько неоптимальных параллельных запросов, каждый из которых требует по 15-20 GB Memory Grant, они быстро исчерпают любой объем RAM, заблокировав остальные очереди.

Как параметр max server memory влияет на ошибку 8645?

Пул памяти под Memory Grants выделяется как доля от доступного пространства буферного пула. Если max server memory занижен или физическая память вытеснена ОС, лимит под запросы резко сжимается.

Как хинт min_grant_percent / max_grant_percent помогает при ошибке 8645?

Хинт OPTION (MAX_GRANT_PERCENT = 5) принудительно ограничивает аппетит тяжелого запроса, предотвращая истощение ресурсов в Resource Pool.

Полезные материалы
Рекомендуем