sys.dm_exec_query_memory_grants(Transact-SQL)
실행하는 데 필요한 메모리가 이미 부여되었거나 아직 부여되지 않은 쿼리에 대한 정보를 반환합니다. 메모리 부여를 기다릴 필요가 없는 쿼리는 이 뷰에 나타나지 않습니다.
열 이름 |
데이터 형식 |
설명 |
---|---|---|
session_id |
smallint |
이 쿼리가 실행되고 있는 세션의 ID(SPID)입니다. |
request_id |
int |
요청의 ID입니다. 세션의 컨텍스트에서 고유합니다. |
scheduler_id |
int |
이 쿼리를 예약하고 있는 스케줄러의 ID입니다. |
dop |
smallint |
이 쿼리의 병렬 처리 수준입니다. |
request_time |
datetime |
이 쿼리가 메모리 부여를 요청한 날짜와 시간입니다. |
grant_time |
datetime |
이 쿼리에 메모리가 부여된 날짜와 시간입니다. 아직 메모리가 부여되지 않은 경우 NULL이 됩니다. |
requested_memory_kb |
bigint |
요청된 총 메모리 양(KB)입니다. |
granted_memory_kb |
bigint |
실제로 부여된 총 메모리 양(KB)입니다. 아직 메모리가 부여되지 않은 경우 NULL이 될 수 있습니다. 일반적인 경우 이 값은 requested_memory_kb와 같아야 합니다. 인덱스 생성 시에는 서버가 처음 부여된 메모리 외에 요청 시 메모리를 추가로 허용할 수 있습니다. |
required_memory_kb |
bigint |
이 쿼리를 실행하는 데 필요한 최소 메모리(KB)입니다. requested_memory_kb는 이 양보다 크거나 같습니다. |
used_memory_kb |
bigint |
현재 사용된 실제 메모리(KB)입니다. |
max_used_memory_kb |
bigint |
현재까지 사용된 최대 실제 메모리(KB)입니다. |
query_cost |
float |
예상 쿼리 비용입니다. |
timeout_sec |
int |
이 쿼리가 메모리 부여 요청을 포기하기까지의 제한 시간(초)입니다. |
resource_semaphore_id |
smallint |
이 쿼리가 대기 중인 리소스 세마포의 고유하지 않은 ID입니다.
|
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) |
이 쿼리 계획의 식별자입니다. sys.dm_exec_query_plan을 사용하여 실제 XML 계획을 추출할 수 있습니다. |
sql_handle |
varbinary(64) |
이 쿼리에 대한 Transact-SQL 텍스트의 식별자입니다. sys.dm_exec_sql_text를 사용하여 실제 Transact-SQL 텍스트를 가져올 수 있습니다. |
group_id |
int |
이 쿼리가 실행하고 있는 작업 그룹의 ID입니다. |
pool_id |
int |
이 작업 그룹이 속한 리소스 풀의 ID입니다. |
is_small |
tinyint |
1로 설정되면 이 부여에서 작은 리소스 세마포를 사용합니다. 0으로 설정되면 일반 세마포가 사용됩니다. |
ideal_memory_kb |
bigint |
실제 메모리에 적합하도록 부여된 메모리 크기(KB)입니다. 이 크기는 카디널리티 예측에 기반합니다. |
사용 권한
서버에 대한 VIEW SERVER STATE 권한이 필요합니다.
주의
쿼리 제한 시간에 대한 일반적인 디버깅 시나리오는 다음과 같습니다.
sys.dm_os_memory_clerks, sys.dm_os_sys_info 및 다양한 성능 카운터를 사용하여 전체 시스템 메모리 상태를 확인합니다.
sys.dm_os_memory_clerks의 type = 'MEMORYCLERK_SQLQERESERVATIONS'에서 쿼리 실행 메모리 예약을 확인합니다.
sys.dm_exec_query_memory_grants를 사용하여 권한 부여 대기 중인 쿼리를 확인합니다.
sys.dm_exec_requests를 사용하여 메모리 사용량이 많은 쿼리를 자세히 검사합니다.
런어웨이 쿼리가 의심되는 경우 sys.dm_exec_query_plan의 실행 계획과 sys.dm_exec_sql_text의 일괄 처리 텍스트를 검사합니다.
쿼리에서 ORDER BY 또는 집계가 포함된 동적 관리 뷰를 사용하는 경우 메모리 사용이 증가하여 해결하려는 문제가 악화될 수 있습니다.
데이터베이스 관리자는 리소스 관리자 기능을 사용하여 서버 리소스를 최대 20개의 리소스 풀에 배치할 수 있습니다. SQL Server 2008부터 각 풀은 독립된 작은 서버 인스턴스와 같이 작동하며 2개의 세마포가 필요합니다. sys.dm_exec_query_resource_semaphores에서 반환되는 행 수는 SQL Server 2005에서 반환된 행 수의 최대 20배가 될 수 있습니다.