다음을 통해 공유


sys.dm_os_workers(Transact-SQL)

시스템의 각 작업자에 대해 행을 반환합니다.

열 이름

데이터 형식

설명

worker_address

varbinary(8)

작업자의 메모리 주소입니다.

status

int

내부적으로만 사용됩니다.

is_preemptive

bit

1 = 작업자가 선점형 일정 예약을 사용하여 실행되고 있습니다. 외부 코드를 실행 중인 작업자는 선점형 일정 예약을 사용하여 실행됩니다.

is_fiber

bit

1 = 작업자가 경량 풀링을 사용하여 실행되고 있습니다. 자세한 내용은 sp_configure(Transact-SQL)를 참조하십시오.

is_sick

bit

1 = 작업자가 스핀 잠금을 획득하려고 하는 중 멈췄습니다. 이 비트가 설정된 경우 자주 액세스되는 개체에 경합 문제가 있음을 나타내는 것일 수 있습니다.

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

int

이 작업자가 SUSPENDED 상태로 들어간 지정 시간(ms_ticks)입니다. sys.dm_os_sys_info의 ms_ticks에서 이 값을 빼면 작업자가 대기한 시간(밀리초)이 반환됩니다.

wait_resumed_ms_ticks

int

이 작업자가 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)

예외가 발생한 코드 주소입니다.

locale

int

작업자에 대한 로캘 LCID 설정입니다.

affinity

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(Transact-SQL)를 참조하십시오.

scheduler_address

varbinary(8)

스케줄러의 메모리 주소입니다. 자세한 내용은 sys.dm_os_schedulers(Transact-SQL)를 참조하십시오.

processor_group

smallint

이 스레드에 할당된 프로세서 그룹 ID를 저장합니다.

주의

작업자 상태가 RUNNING이고 작업자가 비선점형 모드로 실행되고 있으면 작업자 주소가 sys.dm_os_schedulers의 active_worker_address와 일치합니다.

이벤트를 기다리고 있는 작업자가 신호를 받으면 해당 작업자가 실행 가능한 큐의 맨 처음에 배치됩니다. SQL Server에서는 이 작업이 연속해서 1,000회 발생할 수 있습니다. 그런 다음 작업자가 큐 끝에 배치됩니다. 작업자를 큐 끝으로 이동하면 성능에 약간 영향을 줍니다.

사용 권한

서버에 대한 VIEW SERVER 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됩니다.