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_orderpool_idgroup_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
    

См. также