Nó cũng có thể hữu ích để làm việc thông qua một ví dụ. Hãy xem xét ba trạng thái phổ biến nhất cho một công nhân :
CHẠY = Công nhân hiện đang chạy hoặc không từ chối hoặc phòng ngừa.
RUNNABLE = Công nhân đã sẵn sàng để chạy trên lịch trình.
TẠM NGỪNG = Công nhân hiện đang bị đình chỉ, chờ đợi một sự kiện gửi tín hiệu.
Công nhân với trạng thái RUNNING
có thể tạo ra thời gian chờ đợi. Ví dụ, nếu công nhân cần chạy mã trong HĐH thay vì trong SQLOS thì nó có thể phải chờ đợi trước hoặc chờ bên ngoài. Trong thời gian đó, nó sẽ chạy mã trên CPU được liên kết của nó nhưng nó vẫn sẽ tạo ra thời gian chờ.
Công nhân với trạng thái RUNNABLE
có thể tạo ra thời gian chờ đợi (theo như tôi biết họ luôn làm). Nếu công nhân được báo hiệu rằng tài nguyên đã có sẵn thì nó có thể tích lũy thời gian chờ tín hiệu dựa trên lần chờ cuối cùng. Nếu công nhân cạn kiệt lượng tử 4 ms trước đó thì nó có thể tích lũy SOS_SCHEDULER_YIELD
thời gian chờ.
Công nhân với trạng thái SUSPENDED
có thể tạo ra thời gian chờ đợi. Hãy xem xét một công nhân đang chờ khóa. Nó sẽ tạo ra thời gian chờ cho đến khi được báo hiệu rằng tài nguyên khóa mà nó cần có sẵn. Một số công nhân bị đình chỉ không tạo ra thời gian chờ đợi, bao gồm cả những người không liên quan đến một nhiệm vụ.
Máy tính để bàn của tôi có bốn lõi logic, vì vậy số lượng nhân viên tối đa mặc định là 512 . Điều đó gần như chắc chắn là không thực tế, nhưng trên máy này về mặt lý thuyết tôi có thể tạo ra 512 giây thời gian chờ mỗi giây nếu tôi quản lý để khiến mọi công nhân chờ đợi một cái gì đó cùng một lúc. Khi số lượng nhân viên / nhân viên tăng lên, con số đó có thể còn cao hơn nữa.
Bạn có thể thấy nhiều hơn một giây chờ đợi mỗi giây ngay cả khi bạn không chạy bất kỳ truy vấn nào đối với SQL Server. Trên máy của tôi, truy vấn sau đây dường như tạo ra giữa 9-14 hàng:
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;
Tôi có thể chụp nhanh tổng thời gian chờ kể từ lần cuối tôi khởi động lại máy chủ và so sánh nó với tổng số mới sau khi chờ mười giây:
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';
Đôi khi toán học hoạt động. Lần cuối cùng tôi chạy nó, đồng bằng là 101339 ms. Nói cách khác, tôi đã có hơn 10 giây chờ đợi mỗi giây chỉ từ các tác vụ hệ thống.