為什麼需要了解Threads?
Threads為SQL底層運作的基礎,SQL的工作執行是由SQLOS layer of the Storage Engine來主導,其工作運作的最小單位為Threads,在執行的過程中,SQL會不斷的調度資源,可能是從IO,可能是從CPU,當資源有限時會造成等待資源的狀況出現。因此了解目前DB在等待什麼資源(Waittype)是一種對資料庫調校的科學方法,可以藉此知道資源瓶頸發生在哪裡。而了解各種Waittype之前的基本功,就是先了解Thread和其運作方式。
- Thread為Process執行的單位
- 一個Process裡面可以存在多個Thread
- 每個Thread會有一個極小的等待時間,而其等待執行的動作為Scheduling
- SQL Server系統會分配CPU資源給Thread使其執行命令,為Worker Thread
- 有一些Threads是專用的,例如執行 Checkpoints, deadlock monitoring。
一搬來說,大部分的Threads在Pool裡面等待,直到有新的Requests - SQL Server 不仰賴Windows scheduling,他有自己獨立的一套工作模式,叫做non-preemptive scheduling,其效率遠比仰賴Windows scheduling高。
- 底層由SQLOS layer of the Storage Engine來主導
- 每一個Core(無論是實體還是邏輯)都擁有一個Scheduler (有8個Core就有8個Scheduler)
- 每個Scheduler負責管理每一個Threads的Execution
- sys.dm_os_schedulers DMV可以用來查詢schedulers