sys.dm_exec_query_memory_grants(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
메모리 부여를 요청하고 대기 중이거나 메모리 부여를 받은 모든 쿼리에 대한 정보를 반환합니다. 메모리 부여가 필요하지 않은 쿼리는 이 보기에 표시되지 않습니다. 예를 들어 정렬 및 해시 조인 작업에는 쿼리 실행에 대한 메모리 부여가 있지만 절이 없는 ORDER BY
쿼리에는 메모리 부여가 없습니다.
Azure SQL Database에서 동적 관리 뷰는 데이터베이스 봉쇄에 영향을 미치는 정보를 노출하거나 사용자가 액세스할 수 있는 다른 데이터베이스에 대한 정보를 노출할 수 없습니다. 이 정보를 노출하지 않으려면 연결된 테넌트에 속하지 않는 데이터가 포함된 모든 행이 필터링됩니다. 또한 열 scheduler_id
wait_order
, , pool_id
group_id
의 값이 필터링되고 열 값이 NULL로 설정됩니다.
참고 항목
Azure Synapse Analytics 또는 PDW(Analytics Platform System)에서 이를 호출하려면 이름을 sys.dm_pdw_nodes_exec_query_memory_grants
사용합니다. 이 구문은 Azure Synapse Analytics의 서버리스 SQL 풀에서 지원되지 않습니다.
열 이름 | 데이터 형식 | 설명 |
---|---|---|
session_id | smallint | 이 쿼리가 실행되고 있는 세션의 ID(SPID)입니다. |
request_id | int | 요청의 ID입니다. 세션의 컨텍스트에서 고유합니다. |
scheduler_id | int | 이 쿼리를 예약하는 스케줄러의 ID입니다. |
dop | smallint | 이 쿼리의 병렬 처리 수준입니다. |
request_time | 날짜/시간 | 이 쿼리가 메모리 부여를 요청한 날짜 및 시간입니다. |
grant_time | 날짜/시간 | 이 쿼리에 대한 메모리가 부여된 날짜 및 시간입니다. 메모리가 아직 부여되지 않은 경우 NULL입니다. |
requested_memory_kb | bigint | 요청된 총 메모리 양(킬로바이트)입니다. |
granted_memory_kb | bigint | 실제로 부여된 총 메모리 양(킬로바이트)입니다. 메모리가 아직 부여되지 않은 경우 NULL일 수 있습니다. 일반적인 경우 이 값은 .와 같 requested_memory_kb 아야 합니다. 인덱스 생성 시에는 서버가 처음 부여된 메모리 외에 요청 시 메모리를 추가로 허용할 수 있습니다. |
required_memory_kb | bigint | 이 쿼리를 실행하는 데 필요한 최소 메모리(KB)입니다. requested_memory_kb 은 이 양보다 같거나 큽다. |
used_memory_kb | bigint | 현재 사용된 실제 메모리(KB)입니다. |
max_used_memory_kb | bigint | 이 순간까지 사용된 최대 물리적 메모리(킬로바이트)입니다. |
query_cost | float | 예상 쿼리 비용입니다. |
timeout_sec | int | 이 쿼리가 메모리 부여 요청을 포기하기 전에 시간 제한(초)입니다. |
resource_semaphore_id | smallint | 이 쿼리가 대기 중인 리소스 세마포의 고유하지 않은 ID입니다. 참고: 이 ID는 SQL Server 2008(10.0.x)보다 이전 버전의 SQL Server에서 고유합니다. 이 변경 내용은 쿼리 실행 문제 해결에 영향을 줄 수 있습니다. 자세한 내용은 이 문서의 뒷부분에 있는 "주의" 섹션을 참조하세요. |
queue_id | smallint | 이 쿼리가 메모리 부여를 기다리는 대기 큐의 ID입니다. 메모리가 이미 부여된 경우 NULL입니다. |
wait_order | int | 지정된 queue_id 쿼리 내에서 대기 중인 쿼리의 순차적 순서입니다. 다른 쿼리에서 메모리 부여를 받거나 시간이 초과되는 경우 지정된 쿼리에 대해 이 값이 변경됩니다. 메모리가 이미 부여된 경우 NULL입니다. |
is_next_candidate | bit | 다음 메모리 부여 후보입니다. 1 = 예 0 = 아니요 NULL = 메모리가 이미 부여되었습니다. |
wait_time_ms | bigint | 대기 시간(밀리초)입니다. 메모리가 이미 부여된 경우 NULL입니다. |
plan_handle | varbinary(64) | 이 쿼리 계획의 식별자입니다. 실제 XML 계획을 추출하는 데 사용합니다 sys.dm_exec_query_plan . |
sql_handle | varbinary(64) | 이 쿼리에 대한 Transact-SQL 텍스트의 식별자입니다. 실제 Transact-SQL 텍스트를 가져오는 데 사용합니다 sys.dm_exec_sql_text . |
group_id | int | 이 쿼리가 실행 중인 워크로드 그룹의 ID입니다. |
pool_id | int | 이 워크로드 그룹이 속한 리소스 풀의 ID입니다. |
is_small | tinyint | 1로 설정하면 이 권한 부여가 작은 리소스 세마포를 사용한다는 것을 나타냅니다. 0으로 설정되면 일반 세마포가 사용됩니다. |
ideal_memory_kb | bigint | 실제 메모리에 적합하도록 부여된 메모리 크기(KB)입니다. 이는 카디널리티 예상치를 기반으로 합니다. |
pdw_node_id | int | 이 배포가 있는 노드의 식별자입니다. 적용 대상: Azure Synapse Analytics, Analytics Platform System(PDW) |
reserved_worker_count | bigint | 예약된 작업자 스레드 수입니다. 적용 대상: SQL Server (SQL Server 2016(13.x)부터 시작) 및 Azure SQL Database |
used_worker_count | bigint | 현재 사용되는 작업자 스레드 수입니다. 적용 대상: SQL Server (SQL Server 2016(13.x)부터 시작) 및 Azure SQL Database |
max_used_worker_count | bigint | 이 순간까지 사용된 최대 작업자 스레드 수입니다. 적용 대상: SQL Server (SQL Server 2016(13.x)부터 시작) 및 Azure SQL Database |
reserved_node_bitmap | bigint | 작업자 스레드가 예약된 NUMA 노드의 비트맵입니다. 적용 대상: SQL Server (SQL Server 2016(13.x)부터 시작) 및 Azure SQL Database |
사용 권한
SQL Server에서 VIEW SERVER STATE
권한이 필요합니다.
Azure SQL 데이터베이스에서 데이터베이스의 VIEW DATABASE STATE
권한이 필요합니다.
SQL Server 2022 이상에 대한 사용 권한
서버에 대한 VIEW SERVER PERFORMANCE STATE 권한이 필요합니다.
설명
포함 ORDER BY
하거나 집계하는 동적 관리 뷰를 사용하는 쿼리는 메모리 사용량을 증가시켜 문제를 해결할 수 있습니다.
데이터베이스 관리자는 리소스 관리자 기능을 사용하여 서버 리소스를 최대 20개의 리소스 풀에 배치할 수 있습니다. SQL Server 2008(10.0.x)부터 각 풀은 작은 독립 서버 인스턴스처럼 동작하며 두 개의 세마포가 필요합니다. 반환 sys.dm_exec_query_resource_semaphores
되는 행 수는 SQL Server 2005(9.x)에서 반환되는 행보다 최대 20배 더 많을 수 있습니다.
예제
쿼리 제한 시간에 대한 일반적인 디버깅 시나리오는 다음을 조사할 수 있습니다.
sys.dm_os_memory_clerks, sys.dm_os_sys_info 및 다양한 성능 카운터를 사용하여 전체 시스템 메모리 상태를 확인합니다.
에서
type = 'MEMORYCLERK_SQLQERESERVATIONS'
쿼리 실행 메모리 예약을sys.dm_os_memory_clerks
확인합니다.다음을 사용하여
sys.dm_exec_query_memory_grants
1에서 부여를 기다리는쿼리를 확인합니다.--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
런어웨이 쿼리가 의심되는 경우 sys.dm_exec_query_plan 열의
query_plan
Showplan을 검사하고 sys.dm_exec_sql_text 일괄 처리를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