Trouble Shooting by Wait type

前陣子有幸參加SQL PASS的課程,由顏瑞宏老師所安排如何利用Wait type去進行Monitor和Trouble Shooting,收穫良多,以下的筆記來自於顏老師的上課講義。

什麼是Waitype?

  1. SQL Server的開發人員自行定義並用於診斷效能瓶頸
  2. 早期的Wait Type總類較少,隨著版本替換,總類上升
  3. Wait Type的執行狀態分為執行中(Running)、等候中(Waiting)、即將啟動(Runnable)
  4. 主要的Wait Resource總類可以分為下列幾種
    a. Resource e.g. I/O, Network, Thread, Memory..
    b.Synchronization e.g. Lock, Latches..
    c. Forced e.g. Yield, Sleep
    d. External e.g. Preemption
    e. Queue e.g. Background tasks
  5. 而在OS的上層SQLOS有權衡量TASK的作業優先權, 對於Wait Type的運作底層知識則可以參考Phil Liu寫的文章:
    http://sqlworker.blogspot.tw/2017/04/sql-server-waits.html
    http://sqlworker.blogspot.tw/2017/05/sqlserver-wait-typesosscheduleryield.html
  6. 不是所有Wait Type都代表系統瓶頸,有很多是背景工作的Waits
    e.g. LAZYWRITER_SLEEP, SQLTRACE_BUFFER_FLUSH, LOGMGR_QUEUE, CHECKPPOINT

繼續閱讀 “Trouble Shooting by Wait type"

OPServer-Table Lock 處理

突然有一天,某個非常重要的Table被Lock,

之前曾經發生過一次,不過沒有找到Root Cause,

當時懷疑是因為Reindex的Job導致該Table被Lock,

不過那個時候沒有確切的證據,因為找錯方向了,

這次很即時的發現是Web的某個Query,

Block了Reindex的Job,然後Reindex的Job又Block其他動作。

當下的動作其實用了幾個簡單的DMV

[blocking_session_id]為佔住資源Block別人的ID

-- Active blocking issues?
SELECT [session_id],
 [wait_duration_ms],
 [wait_type],
 [blocking_session_id]
FROM sys.[dm_os_waiting_tasks]
WHERE [wait_type] LIKE N'LCK%'
ORDER BY [wait_duration_ms];
GO

繼續閱讀 “OPServer-Table Lock 處理"