SQL Server 效能調教 – Waits Statistics
當應用程式傳送指令到資料庫時,資料庫便開始執行該指令,傳回所需要的結果,
從資料庫開始處理到回覆的時間 Total response time
這之間有許多的處理發生,例如資料查詢、排序、記憶體搜尋、計算、資料轉換等等
當線上使用者很多的時候,這樣的交易處理變得更加複雜
因此就會產生 Wait ,等待
等待資源、等待磁碟處理存取資料、等待計算完畢、等待不同 session間的 lock 等
DMV (Dynamic Management View)
SQL Server 對於這些種種的”等待”,都會加以記錄,例如:
等待的時間、等待的原因 Wait Type
這些記錄存放於 SQL Server 的 DMV (Dynamic Management View)
兩個跟Wait 有關的 DMV
- sys.dm_os_wait_stats (累積的歷史資料,從上次SQL server restart service 算起)
- sys.dm_os_waiting_tasks (現在正在執行中的資源等待)
SQLOS 的三種狀態 (Running, Suspended, Runnable)
每一個 thread (執行緒) 在 SQL Server 執行時,都會被 SQLOS排進下列三種狀態
- Running: CPU 執行中
- Suspended:當需要額外的資料時,例如資料在記憶體無法取得時,該 thread 的狀態就會進入suspended
- Runnable:當需要的資料取得之後,就會進入runnable。表示 ready to be in “running”。
每一個 thread 有 4 ms 的時間可以取得 running 執行,FIFO 的循環
如果該 thread 不需要額外的資料,但是 4ms 又沒有執行完畢,那該 thread 會就
Running (4 ms) —-> Runnable ( 4 ms) —–> Running (4 ms)
Total wait time
Total Wait time = resource wait time + signal wait time.
什麼是 Resource Wait?
舉例來說,Update Name
資料的更新,必須要等待資料的寫入,資料庫的transaction log 與磁碟的寫入等
這些磁碟資源的存取就會讓 thread 的狀態從 running 變成 suspended
這就是 Resource Wait 的一種
舉例來說, SELECT NAME 讀取資料
等待從磁碟讀取資料至 buffer,或是等待該 data page 的 lock被釋放等
這也是 Resource Wait 的一種
那什麼是 Signal Wait ?
當 thread 已經存取好資源,由 Suspended 進入 Runnable 的狀態
在 Runnable 的狀態等待 CPU 進入Running 執行
像這樣單純等待 CPU 從 Runnable —-> Running 就是 signal Wait
總結:
Total Wait time = resource wait time + signal wait time.
Resource wait 為資源存取,例如從磁碟存取、例如等待lock 釋放等
Signal Wait 為 Runnable —–> Running ,等待CPU 執行時間
接下來我們要討論更多 Resource Waits 的種類與 SQL Performance 效能的關係。