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입니다.

[!참고]

이 ID는 SQL Server 2008 이전 버전인 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)

이 쿼리 계획의 식별자입니다. 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배가 될 수 있습니다.

참고 항목

참조

sys.dm_exec_query_resource_semaphores(Transact-SQL)

실행 관련 동적 관리 뷰 및 함수(Transact-SQL)