關於透過DM_檢視尋求最佳化MSSQL的方法

sqysl發表於2010-01-20


最近一直想尋求一種類似ORACLE中最佳化系統的方法,也就是透過查詢某個檢視或某個指標來獲取系統當前存在的瓶頸,雖然,象一些書裡介紹的那樣可以透過效能計數器和查詢可以解決某些問題,但畢竟系統內的很多因素之間是互相影響的,並不能立刻從根本上解決存在的瓶頸問題,昨天在邊研究邊做《Microsoft.Press.Inside.Microsoft.SQL.Server.2005.Query.Tuning.and.Optimization.Sep.2007》的筆記,這也是我一直以來想完成的一個任務,就是透過總結、歸納以往我看的有關MSSQL的資料和知識,得出一套切實可行的最佳化MSSQL的方法,起碼要把思路搞清楚,所以最近一直在努力,可昨晚我忽然看到其中提到了sys.dm_os_wait_stats的檢視,這使我忽然看到了希望,覺得MSSQL看來也模仿了ORACLE,在動態檢視裡也記錄了當前系統的等待資訊,這讓我欣喜若狂,今天下午沒去培訓結果查了一下MSSQL2005的資料,原來MSSQL2005的袖裡乾坤也不簡單啊,基本具備了檢視最佳化和查詢的雛形啊,也許以前就有,只是我們沒發現而已。看了幾大類DM檢視和函式,瞭解了一些基本概念,理順了一下思路,先總結如下:
一、透過sys.dm_os_wait_stats獲取系統等待資訊:
1. 獲取數量最多的等待:
SELECT * FROM sys.dm_os_wait_stats
where waiting_tasks_count<>0
ORDER BY waiting_tasks_count desc,wait_time_ms desc
2. 獲取等待時間和最長的等待:
SELECT * FROM sys.dm_os_wait_stats
where waiting_tasks_count<>0
ORDER BY wait_time_ms desc, waiting_tasks_count desc
二、透過sys.dm_os_waiting_tasks獲取資訊:
1. 獲取等待任務相關會話資訊:
select w_tsk.session_id,w_tsk.wait_type,w_tsk.resource_description,s_txt.text from
sys.dm_os_waiting_tasks w_tsk
join
sys.dm_os_tasks a_tsk
on w_tsk.waiting_task_address=a_tsk.task_address
and w_tsk.session_id=a_tsk.session_id
join
sys.dm_exec_requests a_req
on a_tsk.session_id=a_req.session_id
and a_tsk.request_id=a_req.request_id
CROSS APPLY sys.dm_exec_sql_text(a_req.sql_handle) AS s_txt
where w_tsk.blocking_session_id is not null
2. 取獲等待任務資訊:
select * from sys.dm_os_waiting_tasks
where blocking_session_id is not null
order by wait_duration_ms
三、所有事件資訊(因內容較多,在專門文件裡給出)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-1030727/,如需轉載,請註明出處,否則將追究法律責任。

相關文章