sys.dm_exec_query_memory_grants (Transact-SQL)
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
Возвращает сведения обо всех запрошенных запросах и ожидающих предоставления памяти или предоставления памяти. Запросы, которые не требуют предоставления памяти, не будут отображаться в этом представлении. Например, операции сортировки и хэш-соединения предоставляют память для выполнения запросов, а запросы без ORDER BY
предложения не будут предоставлять память.
В База данных SQL Azure динамические административные представления не могут предоставлять сведения, влияющие на доступность базы данных или предоставление сведений о других базах данных, к которым пользователь имеет доступ. Чтобы избежать предоставления этой информации, отфильтровывается каждая строка, содержащая данные, которые не принадлежат подключену клиенту. Кроме того, значения в столбцах scheduler_id
, wait_order
pool_id
group_id
фильтруются; значение столбца имеет значение NULL.
Примечание.
Чтобы вызвать это из Azure Synapse Analytics или Analytics Platform System (PDW), используйте имя sys.dm_pdw_nodes_exec_query_memory_grants
. Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.
Имя столбца | Тип данных | Description |
---|---|---|
session_id | smallint | Идентификатор (SPID) сеанса, в котором выполняется данный запрос. |
request_id | int | Идентификатор запроса. Уникален в контексте сеанса. |
scheduler_id | int | Идентификатор планировщика, который планирует данный запрос. |
dop | smallint | Степень параллелизма данного запроса. |
request_time | datetime | Дата и время обращения запроса за предоставлением памяти. |
grant_time | datetime | Дата и время, когда запросу была предоставлена память. Возвращает значение NULL, если память еще не была предоставлена. |
requested_memory_kb | bigint | Общий объем запрошенной памяти в килобайтах. |
granted_memory_kb | bigint | Общий объем фактически предоставленной памяти в килобайтах. Может быть значение NULL, если память еще не была предоставлена. Для типичной ситуации это значение должно совпадать requested_memory_kb с . Для создания индекса сервер может разрешить дополнительное предоставление по требованию памяти, объем которой выходит за рамки изначально предоставленной памяти. |
required_memory_kb | bigint | Минимальный объем памяти в килобайтах (КБ), необходимый для выполнения данного запроса. requested_memory_kb совпадает или больше, чем эта сумма. |
used_memory_kb | bigint | Используемый в данный момент объем физической памяти (в килобайтах). |
max_used_memory_kb | bigint | Максимальный объем используемой до данного момента физической памяти в килобайтах. |
query_cost | float | Ожидаемая стоимость запроса. |
timeout_sec | int | Время ожидания данного запроса в секундах до отказа от обращения за предоставлением памяти. |
resource_semaphore_id | smallint | Неуникальный идентификатор семафора ресурса, которого ожидает данный запрос. Примечание. Этот идентификатор уникален в версиях SQL Server, предшествующих SQL Server 2008 (10.0.x). Данное изменение может повлиять на устранение проблем в запросах. Дополнительные сведения см. в разделе "Примечания" далее в этой статье. |
queue_id | smallint | Идентификатор ожидающей очереди, в которой данный запрос ожидает предоставления памяти. Значение NULL, если память уже предоставлена. |
wait_order | int | Последовательный порядок ожидающих запросов в заданном порядке queue_id . Это значение может измениться для данного запроса, если другие запросы получают предоставление памяти или время ожидания. ЗНАЧЕНИЕ NULL, если память уже предоставлена. |
is_next_candidate | bit | Является следующим кандидатом на предоставление памяти. 1 = да 0 = нет NULL = память уже предоставлена. |
wait_time_ms | bigint | Время ожидания в миллисекундах. Значение NULL, если память уже предоставлена. |
plan_handle | varbinary(64) | Идентификатор для данного плана запроса. Используется sys.dm_exec_query_plan для извлечения фактического xml-плана. |
sql_handle | varbinary(64) | Идентификатор текста Transact-SQL для этого запроса. Используется sys.dm_exec_sql_text для получения фактического текста Transact-SQL. |
group_id | int | Идентификатор группы рабочей нагрузки, в которой выполняется данный запрос. |
pool_id | int | Идентификатор пула ресурсов, к которому принадлежит данная группа рабочей нагрузки. |
is_small | tinyint | Значение 1 означает, что для данной операции предоставления памяти используется малый семафор ресурса. Значение 0 означает использование обычного семафора. |
ideal_memory_kb | bigint | Объем, в килобайтах (КБ), предоставленной памяти, необходимый для размещения всех данных в физической памяти. Основывается на оценке количества элементов. |
pdw_node_id | int | Идентификатор узла, на который находится данное распределение. Область применения: Azure Synapse Analytics, Analytics Platform System (PDW) |
reserved_worker_count | bigint | Количество зарезервированных рабочих потоков. Область применения: SQL Server (начиная с SQL Server 2016 (13.x)) и База данных SQL Azure |
used_worker_count | bigint | Количество рабочих потоков, используемых в данный момент. Область применения: SQL Server (начиная с SQL Server 2016 (13.x)) и База данных SQL Azure |
max_used_worker_count | bigint | Максимальное количество рабочих потоков, используемых до этого момента. Область применения: SQL Server (начиная с SQL Server 2016 (13.x)) и База данных SQL Azure |
reserved_node_bitmap | bigint | Растровое изображение узлов NUMA, в которых зарезервированы рабочие потоки . Область применения: SQL Server (начиная с SQL Server 2016 (13.x)) и База данных SQL Azure |
Разрешения
В SQL Server требуется разрешение VIEW SERVER STATE
.
Для База данных SQL Azure требуется VIEW DATABASE STATE
разрешение в базе данных.
Разрешения для SQL Server 2022 и более поздних версий
Требуется разрешение VIEW SERVER PERFORMANCE STATE на сервере.
Замечания
Запросы, использующие динамические административные представления, которые включают ORDER BY
или агрегаты, могут увеличить потребление памяти и, таким образом, внести свой вклад в проблему, которую они устраняют.
Регулятор ресурсов позволяет администратору базы данных распределять ресурсы сервера между пулами ресурсов, используя до 64 пулов. Начиная с SQL Server 2008 (10.0.x), каждый пул работает как небольшой независимый экземпляр сервера и требует двух семафоров. Число возвращаемых строк может превышать 20 раз больше, чем строки, возвращаемые sys.dm_exec_query_resource_semaphores
в SQL Server 2005 (9.x).
Примеры
Типичный сценарий отладки для времени ожидания запроса может исследовать следующее:
Проверьте общее состояние памяти системы с помощью sys.dm_os_memory_clerks, sys.dm_os_sys_info и различных счетчиков производительности.
Проверьте резервирование памяти выполнения запросов в
sys.dm_os_memory_clerks
том местеtype = 'MEMORYCLERK_SQLQERESERVATIONS'
.Проверьте наличие запросов, ожидающих1 для предоставления грантов с помощью
sys.dm_exec_query_memory_grants
:--Find all queries waiting in the memory queue SELECT * FROM sys.dm_exec_query_memory_grants WHERE grant_time IS NULL;
1 В этом случае типом ожидания, как правило, является RESOURCE_SEMAPHORE. Для получения дополнительной информации см. sys.dm_os_wait_stats (Transact-SQL).
Кэш поиска запросов с предоставлением памяти с помощью sys.dm_exec_cached_plans (Transact-SQL) и sys.dm_exec_query_plan (Transact-SQL)
-- retrieve every query plan from the plan cache USE master; GO SELECT * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle); GO
Если запрос на запуск подозревается, проверьте Showplan в столбце
query_plan
из sys.dm_exec_query_plan и пакетtext
запросов из sys.dm_exec_sql_text. Дополнительные сведения о выполнении запросов с интенсивным объемом памяти с помощью sys.dm_exec_requests.--Active requests with memory grants SELECT --Session data s.[session_id], s.open_transaction_count --Memory usage , r.granted_query_memory, mg.grant_time, mg.requested_memory_kb, mg.granted_memory_kb, mg.required_memory_kb, mg.used_memory_kb, mg.max_used_memory_kb --Query , query_text = t.text, input_buffer = ib.event_info, query_plan_xml = qp.query_plan, request_row_count = r.row_count, session_row_count = s.row_count --Session history and status , s.last_request_start_time, s.last_request_end_time, s.reads, s.writes, s.logical_reads, session_status = s.[status], request_status = r.status --Session connection information , s.host_name, s.program_name, s.login_name, s.client_interface_name, s.is_user_process FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_requests AS r ON r.[session_id] = s.[session_id] LEFT OUTER JOIN sys.dm_exec_query_memory_grants AS mg ON mg.[session_id] = s.[session_id] OUTER APPLY sys.dm_exec_sql_text (r.[sql_handle]) AS t OUTER APPLY sys.dm_exec_input_buffer(s.[session_id], NULL) AS ib OUTER APPLY sys.dm_exec_query_plan (r.[plan_handle]) AS qp WHERE mg.granted_memory_kb > 0 ORDER BY mg.granted_memory_kb desc, mg.requested_memory_kb desc; GO