답변:
아니오-대기 통계는 서버 자체에 소요 된 실제 시간보다 더 많을 수 있습니다.
두 개의 개별 스레드가 동일한 리소스를 기다리는 데 동일한 초를 소비하는 상황을 상상해보십시오. 클럭 시간 1 초 동안 2 초의 대기 시간이 있습니다.
각 스레드에는 자체 대기가 있습니다. 메시지는 마지막 5 초의 클럭 시간 동안 특정 리소스에 대해 20 초의 대기 시간이 발생했음을 알려줍니다.
다시 말하면, 각 코어는 동시에 여러 쿼리를 실행할 수 있으며 여러 코어가 더 많은 대기 시간을 추가 할 수 있습니다. 즉, 단위는 실제로 초가 아닌 스레드 / 초입니다.
예제를 통해 작업하는 것이 도움이 될 수도 있습니다. 근로자 에게 가장 일반적인 세 가지 상태를 고려하십시오 .
RUNNING = 작업자가 현재 비선 점적 또는 선점 적으로 실행 중입니다.
RUNNABLE = 작업자가 스케줄러에서 실행할 준비가되었습니다.
SUSPENDED = 워커가 현재 일시 중단되어 이벤트가 신호를 보내기를 기다리는 중입니다.
상태 인 작업자 RUNNING
는 대기 시간을 생성 할 수 있습니다. 예를 들어 작업자가 SQLOS 대신 OS에서 코드를 실행해야하는 경우 선점 또는 외부 대기를 입력 할 수 있습니다. 그 시간 동안 관련 CPU에서 코드를 실행하지만 여전히 대기 시간을 생성합니다.
(상태가 RUNNABLE
항상 아는 한) 상태 인 근로자 는 대기 시간을 생성 할 수 있습니다. 작업자에게 리소스를 사용할 수 있다는 신호가 표시되면 마지막 대기 시간을 기준으로 신호 대기 시간이 누적 될 수 있습니다. 작업자가 이전 4ms 퀀텀을 모두 사용한 경우 SOS_SCHEDULER_YIELD
대기 시간 이 누적 될 수 있습니다 .
상태 인 작업자 SUSPENDED
는 대기 시간을 생성 할 수 있습니다. 자물쇠를 기다리는 노동자를 고려하십시오. 필요한 잠금 자원이 사용 가능하다는 신호를받을 때까지 대기 시간을 생성합니다. 일시 중단 된 일부 근로자는 작업과 관련되지 않은 근로자를 포함하여 대기 시간을 생성하지 않습니다.
내 데스크탑에는 4 개의 논리 코어가 있으므로 기본 최대 작업자 수는 512 입니다. 거의 확실히 비현실적이지만,이 기계에서 모든 작업자가 한 번에 무언가를 기다리게하면 이론적으로 초당 512 초의 대기 시간을 생성 할 수 있습니다. 핵심 / 작업자 수가 증가함에 따라 그 수가 더 높아질 수 있습니다.
SQL Server에 대해 쿼리를 실행하지 않더라도 초당 1 초 이상의 대기를 볼 수 있습니다. 내 컴퓨터에서 다음 쿼리는 9-14 행 사이에서 생성되는 것 같습니다.
SELECT [state], last_wait_type, wait_started_ms_ticks
FROM sys.dm_os_workers
WHERE [state] IN ('SUSPENDED', 'RUNNABLE')
AND task_address IS NOT NULL
AND wait_started_ms_ticks <> 0
AND wait_started_ms_ticks >= start_quantum;
서버를 마지막으로 다시 시작한 후 총 대기 시간의 스냅 샷을 만들어 10 초 동안 기다린 후 새 총 시간과 비교할 수 있습니다.
DECLARE @start_wait_time_ms BIGINT;
SELECT @start_wait_time_ms = SUM(wait_time_ms)
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';
WAITFOR DELAY '00:00:10';
SELECT SUM(wait_time_ms) - @start_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';
때로는 수학이 작동합니다. 마지막으로 실행했을 때 델타는 101339ms였습니다. 다시 말해, 시스템 작업으로 인해 초당 10 초 이상의 대기 시간이있었습니다.