MSSQL Error 49918: Resource Governor reached maximum memory grant limit
- Ошибка выполнения запроса:
Msg 49918, Level 16, State 1: Resource Governor reached maximum memory grant limit. - Массовые ожидания сессий по типу
RESOURCE_SEMAPHORE. - Зависание тяжелых выборок, отчетов и группировок с сортировками.
1. Выявление запросов, удерживающих и ожидающих выделения памяти
SELECT
r.session_id,
r.requested_memory_kb / 1024 AS Requested_MB,
r.granted_memory_kb / 1024 AS Granted_MB,
r.wait_time_ms,
r.resource_semaphore_id,
t.text AS QueryText
FROM sys.dm_exec_query_memory_grants r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
ORDER BY r.requested_memory_kb DESC;2. Корректировка параметров пула Resource Governor
Увеличьте максимальный процент памяти на один запрос (REQUEST_MAX_MEMORY_GRANT_PERCENT):
ALTER RESOURCE POOL [default]
WITH (
MAX_MEMORY_PERCENT = 90,
REQUEST_MAX_MEMORY_GRANT_PERCENT = 25
);
ALTER RESOURCE GOVERNOR RECONFIGURE;3. Оптимизация неэффективных запросов с избыточным Memory Grant
Избыточный запрос памяти часто вызван неточной статистикой (Cardinality Estimation). Добавьте подсказку к проблемным запросам:
-- Ограничение выделяемой памяти на уровне отдельного запроса (в байтах/процентах)
SELECT * FROM dbo.HeavyTable
ORDER BY CreatedDate
OPTION (MIN_GRANT_PERCENT = 1, MAX_GRANT_PERCENT = 5);4. Настройка параметра Max Server Memory
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 61440; -- 60 GB
RECONFIGURE; Частые вопросы (FAQ)
Что такое Memory Grant в SQL Server?
Это объем оперативной памяти, выделяемый запросу перед выполнением для выполнения операций сортировки (Sort), хеширования (Hash Join) и группировки в RAM.
Почему возникает ожидание RESOURCE_SEMAPHORE?
Ожидание возникает, когда суммарный объем запрашиваемой активными запросами памяти превышает лимит пула, и новые запросы встают в очередь ожидания освобождения RAM.
Как неточная статистика влияет на ошибку 49918?
Если статистика показывает, что запрос вернет 10 миллионов строк вместо 10 штук, оптимизатор запросит гигантский объем памяти, исчерпав доступный лимит пула.
Помогает ли включение Resource Governor при дефолтных настройках?
По умолчанию лимит на один запрос составляет 25% от доступного пула. При наличии очень тяжелых аналитических задач этот лимит может потребовать расширения.