sys.dm_os_workers(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
시스템의 모든 작업자에 대한 행을 반환합니다. 작업자에 대한 자세한 내용은 스레드 및 태스크 아키텍처 가이드를 참조하세요.
참고 항목
Azure Synapse Analytics 또는 분석 플랫폼 시스템(PDW)에서 이를 호출하려면 이름 sys.dm_pdw_nodes_os_workers를 사용합니다. 이 구문은 Azure Synapse Analytics의 서버리스 SQL 풀에서 지원되지 않습니다.
열 이름 | 데이터 형식 | 설명 |
---|---|---|
worker_address | varbinary(8) | 작업자의 메모리 주소입니다. |
status | int | 내부용으로만 사용됩니다. |
is_preemptive | bit | 1 = 작업자가 선점형 일정으로 실행되고 있습니다. 외부 코드를 실행하는 모든 작업자는 선점적 일정에 따라 실행됩니다. |
is_fiber | bit | 1 = 작업자가 경량 풀링을 사용하여 실행 중입니다. 자세한 내용은 sp_configure(Transact-SQL)를 참조하세요. |
is_sick | bit | 1 = 작업자가 spinlock을 획득하려고 하는 중 멈췄습니다. 이 비트를 설정하면 자주 액세스하는 개체에서 경합 문제가 발생할 수 있습니다. |
is_in_cc_exception | bit | 1 = 작업자가 현재 SQL Server 예외가 아닌 다른 예외를 처리하고 있습니다. |
is_fatal_exception | bit | 이 작업자가 치명적인 예외를 받았는지 여부를 지정합니다. |
is_inside_catch | bit | 1 = 작업자가 현재 예외를 처리하고 있습니다. |
is_in_polling_io_completion_routine | bit | 1 = 작업자가 현재 보류 중인 I/O에 대해 I/O 완료 루틴을 실행하고 있습니다. 자세한 내용은 sys.dm_io_pending_io_requests(Transact-SQL)를 참조하세요. |
context_switch_count | int | 이 작업자가 수행하는 스케줄러 컨텍스트 스위치의 수입니다. |
pending_io_count | int | 이 작업자가 수행하는 실제 I/O 수입니다. |
pending_io_byte_count | bigint | 이 작업자에 대해 보류 중인 모든 실제 I/O의 총 바이트 수입니다. |
pending_io_byte_average | int | 이 작업자의 실제 I/O에 대한 평균 바이트 수입니다. |
wait_started_ms_ticks | bigint | 이 작업자가 SUSPENDED 상태로 들어간 지정 시간(ms_ticks)입니다. sys.dm_os_sys_info에서 이 값을 빼면 작업자가 대기한 시간(밀리초)이 반환됩니다. |
wait_resumed_ms_ticks | bigint | 이 작업자가 RUNNABLE 상태로 들어간 지정 시간(ms_ticks)입니다. sys.dm_os_sys_info의 ms_ticks에서 이 값을 빼면 실행 가능 큐에서 작업자가 대기한 시간(밀리초)이 반환됩니다. |
task_bound_ms_ticks | bigint | 이 작업자에 태스크가 바인딩되는 지정 시간(ms_ticks)입니다. |
worker_created_ms_ticks | bigint | 작업자가 생성되는 지정 시간(ms_ticks)입니다. |
exception_num | int | 이 작업자가 마지막으로 발생한 예외의 오류 번호입니다. |
exception_severity | int | 이 작업자에 마지막으로 발생한 예외의 심각도입니다. |
exception_address | varbinary(8) | 예외를 throw한 코드 주소 |
선호도 | bigint | 작업자의 스레드 선호도입니다. sys.dm_os_threads(Transact-SQL)의 스레드 선호도와 일치합니다. |
state | nvarchar(60) | 작업자 상태입니다. 다음 값 중 하나일 수 있습니다. INIT = 작업자가 현재 초기화 중입니다. RUNNING = 작업자가 현재 비선점적으로 또는 선점적으로 실행 중입니다. RUNNABLE = 작업자가 스케줄러에서 실행할 준비가 된 경우 SUSPENDED = 작업자가 현재 일시 중단되어 이벤트가 신호를 보낼 때까지 기다립니다. |
start_quantum | bigint | 이 작업자의 현재 실행이 시작된 시간(밀리초)입니다. |
end_quantum | bigint | 이 작업자의 현재 실행이 종료된 시간(밀리초)입니다. |
last_wait_type | nvarchar(60) | 마지막 대기의 유형입니다. 대기 형식 목록은 sys.dm_os_wait_stats(Transact-SQL)를 참조하세요. |
return_code | int | 마지막 대기에서 반환된 값입니다. 다음 값 중 하나일 수 있습니다. 0 = 성공 3 = 교착 상태 4 = 중간 시작 258 = 시간 제한 |
quantum_used | bigint | 내부용으로만 사용됩니다. |
max_quantum | bigint | 내부용으로만 사용됩니다. |
boost_count | int | 내부용으로만 사용됩니다. |
tasks_processed_count | int | 이 작업자가 처리한 작업 수입니다. |
fiber_address | varbinary(8) | 이 작업자가 연결된 파이버의 메모리 주소입니다. NULL = SQL Server가 경량 풀링을 사용하도록 구성되지 않았습니다. |
task_address | varbinary(8) | 현재 작업의 메모리 주소입니다. 자세한 내용은 sys.dm_os_tasks(Transact-SQL)를 참조하세요. |
memory_object_address | varbinary(8) | 작업자 메모리 개체의 메모리 주소입니다. 자세한 내용은 sys.dm_os_memory_objects(Transact-SQL)를 참조하세요. |
thread_address | varbinary(8) | 이 작업자와 연관된 스레드의 메모리 주소입니다. 자세한 내용은 sys.dm_os_threads(Transact-SQL)를 참조하세요. |
signal_worker_address | varbinary(8) | 이 개체에 마지막으로 신호를 보낸 작업자의 메모리 주소입니다. 자세한 내용은 sys.dm_os_workers를 참조하세요. |
scheduler_address | varbinary(8) | 스케줄러의 메모리 주소입니다. 자세한 내용은 sys.dm_os_schedulers(Transact-SQL)를 참조하세요. |
processor_group | smallint | 이 스레드에 할당된 프로세서 그룹 ID를 저장합니다. |
pdw_node_id | int | 적용 대상: Azure Synapse Analytics, Analytics Platform System(PDW) 이 배포가 있는 노드의 식별자입니다. |
설명
작업자 상태가 실행 중이고 작업자가 비선기적으로 실행되는 경우 작업자 주소는 sys.dm_os_schedulers active_worker_address 일치합니다.
이벤트를 기다리고 있는 작업자가 신호를 받으면 해당 작업자가 실행 가능한 큐의 맨 처음에 배치됩니다. SQL Server에서는 이 작업이 연속해서 1,000회 발생할 수 있습니다. 그런 다음 작업자가 큐 끝에 배치됩니다. 작업자를 큐의 끝으로 이동하면 성능에 몇 가지 영향을 줍니다.
사용 권한
SQL Server에서 VIEW SERVER STATE
권한이 필요합니다.
SQL Database 프리미엄 계층에서 데이터베이스에 대한 VIEW DATABASE STATE
권한이 필요합니다. SQL Database 표준 및 기본 계층에서 Server Admin
역할 멤버 자격 또는 Azure Active Directory admin
계정이 필요합니다.
SQL Server 2022 이상에 대한 사용 권한
서버에 대한 VIEW SERVER PERFORMANCE STATE 권한이 필요합니다.
예제
다음 쿼리를 사용하여 작업자가 SUSPENDED 또는 RUNNABLE 상태에서 실행된 기간을 확인할 수 있습니다.
SELECT
t1.session_id,
CONVERT(varchar(10), t1.status) AS status,
CONVERT(varchar(15), t1.command) AS command,
CONVERT(varchar(10), t2.state) AS worker_state,
w_suspended =
CASE t2.wait_started_ms_ticks
WHEN 0 THEN 0
ELSE
t3.ms_ticks - t2.wait_started_ms_ticks
END,
w_runnable =
CASE t2.wait_resumed_ms_ticks
WHEN 0 THEN 0
ELSE
t3.ms_ticks - t2.wait_resumed_ms_ticks
END
FROM sys.dm_exec_requests AS t1
INNER JOIN sys.dm_os_workers AS t2
ON t2.task_address = t1.task_address
CROSS JOIN sys.dm_os_sys_info AS t3
WHERE t1.scheduler_id IS NOT NULL;
결과 집합은 다음과 같습니다.
session_id status command worker_state w_suspended w_runnable
---------- ---------- --------------- ------------ ----------- --------------------
4 background LAZY WRITER SUSPENDED 688 688
6 background LOCK MONITOR SUSPENDED 4657 4657
19 background BRKR TASK SUSPENDED 603820344 603820344
14 background BRKR EVENT HNDL SUSPENDED 63583641 63583641
51 running SELECT RUNNING 0 0
2 background RESOURCE MONITO RUNNING 0 603825954
3 background LAZY WRITER SUSPENDED 422 422
7 background SIGNAL HANDLER SUSPENDED 603820485 603820485
13 background TASK MANAGER SUSPENDED 603824704 603824704
18 background BRKR TASK SUSPENDED 603820407 603820407
9 background TRACE QUEUE TAS SUSPENDED 454 454
52 suspended SELECT SUSPENDED 35094 35094
1 background RESOURCE MONITO RUNNING 0 603825954
출력에서 이 w_runnable
w_suspended
값은 작업자가 SUSPENDED 상태인 시간을 나타냅니다. 그렇지 않으면 w_runnable
은 작업자가 RUNNABLE 상태에서 소요한 시간을 나타냅니다. 출력에서 세션 52
은 밀리초 단위 35,094
입니다SUSPENDED
.
참고 항목
SQL Server 운영 체제 관련 동적 관리 뷰(Transact-SQL)
쿼리 처리 아키텍처 가이드
스레드 및 태스크 아키텍처 가이드