sys.dm_exec_requests(Transact-SQL)

적용 대상: 예SQL Server(지원되는 모든 버전) 예Azure SQL Database 예Azure Synapse Analytics

에서 실행 중인 각 요청에 대한 정보를 SQL Server 반환합니다. 요청에 대한 자세한 내용은 스레드 및 태스크 아키텍처 가이드를 참조하세요.

참고

또는 의 전용 SQL 풀에서 이를 호출하려면 Azure Synapse Analytics 분석 플랫폼 시스템(PDW) sys.dm_pdw_exec_requests(Transact-SQL)를참조하세요. 서버리스 SQL 풀의 경우 sys.dm_exec_requests 를 사용합니다.

열 이름 데이터 형식 Description
session_id smallint 이 요청과 관련된 세션의 ID입니다. Null을 허용하지 않습니다.
request_id int 요청의 ID입니다. 세션의 컨텍스트에서 고유합니다. Null을 허용하지 않습니다.
start_time datetime 요청이 도착한 타임스탬프입니다. Null을 허용하지 않습니다.
상태 nvarchar(30) 요청의 상태입니다. 다음 값 중 하나일 수 있습니다.

배경
실행 중
실행 가능
중지 중
일시 중단

Null을 허용하지 않습니다.
명령을 사용합니다. nvarchar(32) 처리되고 있는 명령의 현재 유형을 식별합니다. 일반적인 명령 유형에는 다음 값이 포함되었습니다.

SELECT
INSERT
UPDATE
Delete
BACKUP LOG
BACKUP DATABASE
DBCC
FOR

요청 텍스트는 요청에 대한 해당 sql_handle과 함께 sys.dm_exec_sql_text를 사용하여 검색할 수 있습니다. 내부 시스템 프로세스는 수행하는 태스크 유형에 따라 명령을 설정합니다. 작업에는 다음 값이 포함될 수 있습니다.

LOCK MONITOR
CHECKPOINTLAZY
WRITER

Null을 허용하지 않습니다.
sql_handle varbinary(64) 쿼리가 속한 일괄 처리 또는 저장 프로시저를 고유하게 식별하는 토큰입니다. Null을 허용합니다.
statement_start_offset int 0부터 시작하여 현재 실행 중인 일괄 처리 또는 지속형 개체에 대해 현재 실행 중인 문 시작 위치를 바이트 단위로 나타냅니다. , 및 동적 관리 함수와 함께 사용하여 요청에 대해 현재 실행 중인 문을 검색할 수 sql_handle statement_end_offset sys.dm_exec_sql_text 있습니다. Null을 허용합니다.
statement_end_offset int 0부터 시작하여 현재 실행 중인 일괄 처리 또는 지속형 개체에 대해 현재 실행 중인 문 끝 위치를 바이트 단위로 나타냅니다. , 및 동적 관리 함수와 함께 사용하여 요청에 대해 현재 실행 중인 문을 검색할 수 sql_handle statement_start_offset sys.dm_exec_sql_text 있습니다. Null을 허용합니다.
plan_handle varbinary(64) 현재 실행 중인 일괄 처리에 대한 쿼리 실행 계획을 고유하게 식별하는 토큰입니다. Null을 허용합니다.
database_id smallint 요청을 실행 중인 대상 데이터베이스의 ID입니다. Null을 허용하지 않습니다.
user_id int 요청을 제출한 사용자의 ID입니다. Null을 허용하지 않습니다.
connection_id uniqueidentifier 요청이 도착한 연결의 ID입니다. Null을 허용합니다.
blocking_session_id smallint 요청을 차단하고 있는 세션의 ID입니다. 이 열이 NULL이거나 0과 같으면 요청이 차단되지 않거나 차단 세션의 세션 정보를 사용할 수 없거나 식별할 수 없습니다. 자세한 내용은 SQL Server 차단 문제 이해 및 해결을 참조하세요.

-2 = 분리된 분산 트랜잭션이 차단 리소스를 소유합니다.

-3 = 지연된 복구 트랜잭션이 차단 리소스를 소유합니다.

-4 = 내부 래치 상태 전환 때문에 현재 차단 래치 소유자의 세션 ID를 확인할 수 없습니다.

-5 = 이 래치 유형(예: SH 래치)에 대해 추적되지 않으므로 차단 래치 소유자의 세션 ID를 확인할 수 없습니다.

그 자체로 blocking_session_id -5는 성능 문제를 나타내지 않습니다. -5는 세션이 비동기 작업이 완료되는 것을 기다리고 있음을 나타냅니다. -5가 도입되기 전에는 동일한 세션이 대기 상태에 있더라도 blocking_session_id 0으로 표시되었을 것입니다.

워크로드에 따라 -5를 blocking_session_id 관찰하는 것이 일반적일 수 있습니다.
wait_type nvarchar(60) 요청이 현재 차단된 경우 이 열은 대기 유형을 반환합니다. Null을 허용합니다.

대기 유형에 대한 자세한 내용은 sys.dm_os_wait_stats (Transact-SQL)를 참조하세요.
wait_time int 요청이 현재 차단된 경우 이 열은 현재 대기의 기간(밀리초)을 반환합니다. Null을 허용하지 않습니다.
last_wait_type nvarchar(60) 이 요청이 이전에 차단된 경우 이 열은 마지막 대기의 유형을 반환합니다. Null을 허용하지 않습니다.
wait_resource nvarchar(256) 요청이 현재 차단된 경우 이 열은 요청이 현재 대기하고 있는 리소스를 반환합니다. Null을 허용하지 않습니다.
open_transaction_count int 이 요청에 대해 열린 트랜잭션 수입니다. Null을 허용하지 않습니다.
open_resultset_count int 이 요청에 대해 열린 결과 집합 수입니다. Null을 허용하지 않습니다.
transaction_id bigint 이 요청이 실행되는 트랜잭션의 ID입니다. Null을 허용하지 않습니다.
context_info varbinary(128) 세션의 CONTEXT_INFO 값입니다. Null을 허용합니다.
percent_complete real 다음 명령에 대한 작업 완료율입니다.

ALTER INDEX REORGANIZE
ALTER DATABASE의 AUTO_SHRINK 옵션
BACKUP DATABASE
DBCC CHECKDB
DBCC CHECKFILEGROUP
DBCC CHECKTABLE
DBCC INDEXDEFRAG
DBCC SHRINKDATABASE
DBCC SHRINKFILE
RECOVERY
RESTORE DATABASE
ROLLBACK
TDE ENCRYPTION

Null을 허용하지 않습니다.
estimated_completion_time bigint 내부 전용입니다. Null을 허용하지 않습니다.
cpu_time int 요청에 사용된 CPU 시간(밀리초)입니다. Null을 허용하지 않습니다.
total_elapsed_time int 요청이 도착한 이후 경과한 총 시간(밀리초)입니다. Null을 허용하지 않습니다.
scheduler_id int 이 요청을 예약하고 있는 스케줄러의 ID입니다. Null을 허용하지 않습니다.
task_address varbinary(8) 이 요청과 연관된 태스크에 할당된 메모리 주소입니다. Null을 허용합니다.
reads bigint 이 요청에서 수행된 읽기 수입니다. Null을 허용하지 않습니다.
writes bigint 이 요청에서 수행된 쓰기 수입니다. Null을 허용하지 않습니다.
logical_reads bigint 요청에서 수행된 논리적 읽기 수입니다. Null을 허용하지 않습니다.
text_size int 이 요청에 대한 TEXTSIZE 설정입니다. Null을 허용하지 않습니다.
언어 nvarchar(128) 요청에 대한 언어 설정입니다. Null을 허용합니다.
date_format nvarchar(3) 요청에 대한 DATEFORMAT 설정입니다. Null을 허용합니다.
date_first smallint 요청에 대한 DATEFIRST 설정입니다. Null을 허용하지 않습니다.
quoted_identifier bit 1 = QUOTED_IDENTIFIER가 요청에 대해 ON입니다. 그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
arithabort bit 1 = ARITHABORT 설정이 요청에 대해 ON입니다. 그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
ansi_null_dflt_on bit 1 = ANSI_NULL_DFLT_ON 설정이 요청에 대해 ON입니다. 그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
ansi_defaults bit 1 = ANSI_DEFAULTS 설정이 요청에 대해 ON입니다. 그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
ansi_warnings bit 1 = ANSI_WARNINGS 설정이 요청에 대해 ON입니다. 그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
ansi_padding bit 1 = ANSI_PADDING 설정이 요청에 대해 ON입니다.

그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
ansi_nulls bit 1 = ANSI_NULLS 설정이 요청에 대해 ON입니다. 그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
concat_null_yields_null bit 1 = CONCAT_NULL_YIELDS_NULL 설정이 요청에 대해 ON입니다. 그렇지 않으면 0입니다.

Null을 허용하지 않습니다.
transaction_isolation_level smallint 이 요청이 만들어진 트랜잭션의 격리 수준을 나타냅니다. Null을 허용하지 않습니다.
0 = 지정되지 않음
1 = 커밋되지 않은 읽기
2 = 커밋된 읽기
3 = 반복 읽기
4 = 직렬화 가능
5 = 스냅샷
lock_timeout int 이 요청에 대한 잠금 제한 시간(밀리초)입니다. Null을 허용하지 않습니다.
deadlock_priority int 요청에 대한 DEADLOCK_PRIORITY 설정입니다. Null을 허용하지 않습니다.
row_count bigint 이 요청에서 클라이언트에 반환된 행 수입니다. Null을 허용하지 않습니다.
prev_error int 요청이 실행되는 동안 마지막으로 발생한 오류입니다. Null을 허용하지 않습니다.
nest_level int 요청에서 실행되고 있는 코드의 현재 중첩 수준입니다. Null을 허용하지 않습니다.
granted_query_memory int 요청에서 쿼리의 실행에 할당된 페이지 수입니다. Null을 허용하지 않습니다.
executing_managed_code bit 특정 요청이 루틴, 유형 및 트리거 같은 공용 언어 런타임 개체를 현재 실행하고 있는지 나타냅니다. 공용 언어 런타임 개체가 스택에 있을 때 항상 설정되며 공용 언어 런타임 내에서 Transact-SQL을 실행하는 동안에도 마찬가지입니다. Null을 허용하지 않습니다.
group_id int 이 쿼리가 속한 작업 그룹의 ID입니다. Null을 허용하지 않습니다.
query_hash binary(8) 쿼리에서 계산되는 이진 해시 값으로, 비슷한 논리를 가진 쿼리를 식별하는 데 사용됩니다. 쿼리 해시를 사용하여 리터럴 값만 다른 쿼리에 대한 집계 리소스 사용을 확인할 수 있습니다.
query_plan_hash binary(8) 쿼리 실행 계획에서 계산되는 이진 해시 값으로, 비슷한 쿼리 실행 계획을 식별하는 데 사용됩니다. 쿼리 계획 해시를 사용하여 비슷한 실행 계획을 가진 쿼리의 누적 비용을 찾을 수 있습니다.
statement_sql_handle varbinary(64) 적용 대상: SQL Server 2014(12.x) 이상

개별 쿼리의 SQL 핸들입니다.

데이터베이스에 대해 쿼리 저장소 사용하도록 설정되지 않은 경우 이 열은 NULL입니다.
statement_context_id bigint 적용 대상: SQL Server 2014(12.x) 이상

sys.query_context_settings 선택적 외식 키입니다.

데이터베이스에 대해 쿼리 저장소 사용하도록 설정되지 않은 경우 이 열은 NULL입니다.
dop int 적용 대상: SQL Server 2016(13.x) 이상

쿼리의 병렬화 정도입니다.
parallel_worker_count int 적용 대상: SQL Server 2016(13.x) 이상

병렬 쿼리 인 경우 예약 된 병렬 작업자의 수입니다.
external_script_request_id uniqueidentifier 적용 대상: SQL Server 2016(13.x) 이상

현재 요청과 연결 된 외부 스크립트 요청 ID입니다.
is_resumable bit 적용 대상: SQL Server 2017(14.x) 이상

요청이 다시 시작 가능한 인덱스 작업 인지 여부를 나타냅니다.
page_resource binary (8) 적용 대상: SQL Server 2019 (15.x)

열이 페이지를 포함 하는 경우 페이지 리소스의 8 바이트 16 진수 표현입니다 wait_resource . 자세한 내용은 sys.fn_PageResCracker를 참조 하세요.
page_server_reads bigint 적용 대상: Azure SQL Database hyperscale

이 요청에서 수행 된 페이지 서버 읽기 수입니다. Null을 허용하지 않습니다.
     

설명

SQL Server 외부의 코드(예: 확장 저장 프로시저 및 분산 쿼리)를 실행하려면 비선점형 스케줄러의 제어를 벗어나서 스레드를 실행해야 합니다. 작업자는 이 작업을 수행하기 위해 선점형 모드로 전환합니다. 이 동적 관리 뷰에서 반환된 시간 값은 선점형 모드에서 사용된 시간을 포함하지 않습니다.

행 모드에서 병렬 요청을 실행할 경우는 SQL Server 할당 된 작업을 완료 하는 작업을 담당 하는 작업자 스레드를 조정 하는 작업자 스레드를 할당 합니다. 이 DMV에서는 요청에 대해 코디네이터 스레드만 볼 수 있습니다. ,, reads 및 열은 writes logical_reads row_count 코디네이터 스레드에 대해 업데이트 되지 않습니다 . ,,, 및 열은 wait_type wait_time last_wait_type wait_resource granted_query_memory 코디네이터 스레드에 대해서 만 업데이트 됩니다. 자세한 내용은 스레드 및 태스크 아키텍처 가이드를 참조하세요.

사용 권한

사용자에 VIEW SERVER STATE 게 서버에 대 한 권한이 있는 경우 사용자는 인스턴스에서 실행 중인 모든 세션을 볼 수 SQL Server 있습니다. 그렇지 않으면 사용자에 게 현재 세션만 표시 됩니다. VIEW SERVER STATE는 Azure SQL Database에서 부여할 수 없으므로 sys.dm_exec_requests 항상 현재 연결로 제한 됩니다.

Always-On 시나리오에서 보조 복제본이 읽기 전용으로 설정 된 경우 보조 복제본에 대 한 연결은를 추가 하 여 연결 문자열 매개 변수에 응용 프로그램 의도를 지정 해야 합니다 applicationintent=readonly . 그렇지 않으면 권한이 있는 경우에도에 대 한 액세스 검사는 sys.dm_exec_requests 가용성 그룹의 데이터베이스에 대해 전달 되지 않습니다 VIEW SERVER STATE .

예제

A. 실행 중인 일괄 처리에 대한 쿼리 텍스트 찾기

다음 예에서는 sys.dm_exec_requests를 쿼리하여 필요한 쿼리를 찾고 출력에서 sql_handle을 복사합니다.

SELECT * FROM sys.dm_exec_requests;  
GO  

그런 다음 문 텍스트를 가져오기 위해 복사한 sql_handlesys.dm_exec_sql_text(sql_handle) 시스템 함수와 함께 사용합니다.

SELECT * FROM sys.dm_exec_sql_text(< copied sql_handle >);  
GO  

B. 실행 중인 일괄 처리에서 보유하고 있는 모든 잠금 찾기

다음 예제에서는 쿼리 sys.dm_exec_requests 를 쿼리하여 흥미로운 일괄 처리를 찾고 출력에서 해당 일괄 처리를 복사 합니다 transaction_id .

SELECT * FROM sys.dm_exec_requests;  
GO

그런 다음 잠금 정보를 찾으려면 시스템 함수와 함께 복사 된를 사용 합니다 transaction_id sys.dm_tran_locks .

SELECT * FROM sys.dm_tran_locks
WHERE request_owner_type = N'TRANSACTION'
    AND request_owner_id = < copied transaction_id >;
GO  

C. 현재 차단된 모든 요청 찾기

다음 예에서는 sys.dm_exec_requests 를 쿼리하여 차단 된 요청에 대 한 정보를 찾습니다.

SELECT session_id, status, blocking_session_id  
    , wait_type, wait_time, wait_resource
    , transaction_id
FROM sys.dm_exec_requests
WHERE status = N'suspended';  
GO  

D. CPU를 기준으로 기존 요청 순서 지정

SELECT 
   req.session_id
   , req.start_time
   , cpu_time 'cpu_time_ms'
   , object_name(st.objectid,st.dbid) 'ObjectName' 
   , substring
      (REPLACE
        (REPLACE
          (SUBSTRING
            (ST.text
            , (req.statement_start_offset/2) + 1
            , (
               (CASE statement_end_offset
                  WHEN -1
                  THEN DATALENGTH(ST.text)  
                  ELSE req.statement_end_offset
                  END
                    - req.statement_start_offset)/2) + 1)
       , CHAR(10), ' '), CHAR(13), ' '), 1, 512)  AS statement_text  
FROM sys.dm_exec_requests AS req  
   CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) as ST
   ORDER BY cpu_time desc;
GO

추가 정보

다음 단계