Mungkin juga bermanfaat untuk bekerja melalui contoh. Pertimbangkan tiga keadaan paling umum untuk seorang pekerja :
RUNNING = Pekerja saat ini berjalan baik secara nonpreemptive atau preemptively.
RUNNABLE = Pekerja siap berjalan pada penjadwal.
DITANGGUHKAN = Pekerja saat ini ditangguhkan, menunggu acara untuk mengirimkan sinyal.
Pekerja dengan status RUNNING
dapat menghasilkan waktu tunggu. Misalnya, jika pekerja perlu menjalankan kode di OS alih-alih dalam SQLOS maka itu dapat memasukkan menunggu preemptive atau eksternal. Selama waktu itu akan menjalankan kode pada CPU terkait tetapi masih akan menghasilkan waktu tunggu.
Pekerja dengan status RUNNABLE
dapat menghasilkan waktu tunggu (sejauh yang saya tahu mereka selalu lakukan). Jika pekerja diberi sinyal bahwa sumber daya tersedia maka dapat mengumpulkan waktu tunggu sinyal berdasarkan pada menunggu terakhir. Jika pekerja kehabisan 4 ms kuantum sebelumnya maka dapat mengumpulkan SOS_SCHEDULER_YIELD
waktu tunggu.
Pekerja dengan status SUSPENDED
dapat menghasilkan waktu tunggu. Pertimbangkan seorang pekerja yang sedang menunggu kunci. Ini akan menghasilkan waktu tunggu hingga diberi tanda bahwa sumber daya kunci yang dibutuhkan tersedia. Beberapa pekerja yang ditangguhkan tidak menghasilkan waktu tunggu, termasuk yang tidak terkait dengan tugas.
Desktop saya memiliki empat core logis, sehingga jumlah pekerja maks default adalah 512 . Ini hampir tidak praktis, tetapi pada mesin ini saya secara teoritis dapat menghasilkan waktu tunggu 512 detik per detik jika saya berhasil membuat setiap pekerja menunggu sesuatu sekaligus. Seiring dengan bertambahnya jumlah pekerja inti / pekerja, jumlah itu bahkan bisa lebih tinggi.
Anda dapat melihat lebih dari satu detik menunggu per detik walaupun Anda tidak menjalankan kueri apa pun terhadap SQL Server. Di mesin saya, kueri berikut tampaknya menghasilkan antara 9-14 baris:
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;
Saya dapat mengambil snapshot dari total waktu tunggu sejak terakhir kali saya me-restart server dan membandingkannya dengan total baru setelah menunggu sepuluh detik:
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';
Terkadang matematika berhasil. Terakhir kali saya menjalankannya, delta adalah 101339 ms. Dengan kata lain, saya memiliki lebih dari 10 detik menunggu per detik hanya dari tugas-tugas sistem.