MSSQL Ошибка 8645: A timeout occurred while waiting for memory resources
- Запросы падают по таймауту:
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;
GO3. Оптимизация неверных оценок 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; Частые вопросы (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.