top
Loading...
了解你的服務器的狀態

想知道到底哪一個運行T-SQL的連接阻塞了其他的連接?是的,你可以運行sp_who或者查詢syslockinfo表,但是如果你想了解更多有關如何調試這個問題的信息怎么辦?例如,你如何才能判斷阻塞進程運行的是哪一個T-SQL,或者阻塞進程在等待哪一個資源?

唉,對于老一些版本的SQL Server來說,要獲得這些問題的答案可是不易。歷史上,數據庫管理系統并不是由于它的透明度而被人們所認識。系統表提供了一些可見性,數據庫控制臺命令(DBCC)提供得多一些,還有更多的是通過各種沒有文檔的渠道獲得。但是要將這些資源集中到一個單個的查詢中,即使是回答一個表面化的簡單的問題都是一項巨大的工程。

進入數據庫管理視圖

如果你看過我以前寫的有關SQL Server 2005 分類視圖的貼士,你可以了解系統表在最后一版的數據庫管理系統中進行了較大的升級。但是關于這個升級的最有趣的組件是一個叫做“動態管理視圖(DMV)”的東西。盡管分類視圖允許你檢索有關靜態數據庫對象的信息,例如表和存儲過程,動態管理視圖卻可以展示更多的動態信息。

現在你可以訪問以前只能通過性能計數器訪問的信息了;通過使用動態管理視圖,你可以發現更多的詳細信息,并且用它來做更多的事情。例如,這里有5個與查詢計劃存儲區有關的SQL Server性能計數器,還有更多的幾個應用在緩沖存儲器上。但是這些計數器是合計的,他們無法告訴你,例如,哪個計劃被存儲了或者由于每個緩沖存儲區條目引起的磁盤I/O的數量。動態管理視圖可以。查看sys.dm_exec_cached_plans視圖就可以獲得有關查詢計劃存儲區的信息,還有sys.dm_os_memory_cache_entries視圖可以提供非常具體的緩沖存儲區的信息。

與性能計數器類似,通過動態管理視圖檢索到的信息也不是你訪問當時的最新信息。根據視圖的查詢情況,這些視圖提供的數據每秒鐘被更新了數千次。所以閱讀并理解一段時間的輸出的關鍵就是取樣。如果你需要監控某種條件,那么不要通過動態管理視圖來捕捉每個時刻的狀態。采用常見的快照來尋找一般的或者變化的趨勢。或取少量的數據不但可以幫助你頭腦清醒,還可以防止可能讓你的服務器崩潰的數據采集。

使用數據庫管理視圖

那么你可以在哪里找到這些權威的視圖呢?啟動SQL Server Management Studio,打開對象瀏覽器。找到“主”數據庫,然后打開它的視圖層次,然后打開系統視圖。向下滾動,直到你看到以dm_開頭的視圖——這些就是動態管理視圖了。還可以通過Table-valued函數的形式進入。打開Programmability這個層次,然后在函數下面,系統函數,最終是Table-valued函數。你可以看到有關的動態管理函數。這些函數可以在連接視圖的時候用于特殊的幫助任務。

你要注意的第一件事情就是,動態管理視圖是基于他們所屬的10個類別命名的。例如,dm_broker視圖包含了有關SQL Server Broker(代理)的信息;dm_fts視圖顯示了可以幫助管理員進行全文本搜索的信息。但是不要認為來自某個分類的視圖就不可以加入來自其他分類的信息——這就是動態管理視圖的真正強大之處。

讓我們回顧本文早先提到的一個問題:你不但可以判斷,一個阻塞進程運行了什么T-SQL,還可以判斷這個進程在等待什么?

從“exec”(execution)視圖分類開始,特別是sys.dm_exec_requests視圖。通過查看blocking_session_id字段了解阻塞的進程。如果字段是非空的, session_id字段標識的那個會話就是被另一個由blocking_session_id字段標識的會話阻塞了(查看微軟在線書籍了解更多詳細描述)。現在,回到同一個視圖,查詢阻塞會話的sql_handle字段的數值。將這個字段作為sys.dm_exec_sql_text函數的輸入,檢索阻塞了其他進程的T-SQL連接。

現在,你如何獲知被阻塞的資源?跳過“os”(SQLOS)視圖分類,查詢sys.dm_os_waiting_tasks視圖。這個視圖恰好擁有一個名為session_id的字段,——驚喜,驚喜——你可以用它來使該行與sys.dm_exec_requests視圖的blocking_session_id字段產生關聯。

你如何將其放在一起來找到當前哪個查詢阻塞了其他的查詢,還有他們在等待什么資源?以下的查詢是一個不錯的起始點。

SELECT

blocked_query.session_id AS blocked_session_id,

blocking_query.session_id AS blocking_session_id,

sql_text.text AS blocking_text,

waits.wait_type AS blocking_resource

FROM sys.dm_exec_requests blocked_query

JOIN sys.dm_exec_requests blocking_query ON

blocked_query.blocking_session_id = blocking_query.session_id

CROSS APPLY

(

SELECT *

FROM sys.dm_exec_sql_text(blocking_query.sql_handle)

) sql_text

JOIN sys.dm_os_waiting_tasks waits ON

waits.session_id = blocking_query.session_id

很遺憾,本文篇幅所限,只能略為涉及動態管理視圖提供的強大功能的皮毛。關注本網站,閱讀后續的貼士,里面包含更多有深度的場景,它可以幫助你追蹤微妙的性能和利用率問題。與此同時,開始探索吧!數據庫管理系統內部工作機制的這種級別的可見度對于SQL Server數據庫管理員們來說,可是一個新的景象,這些信息可以加以無窮的利用。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗