1. 程式人生 > 其它 >SqlServer 調優的幾個關鍵的步驟--sp_lock,sp_who

SqlServer 調優的幾個關鍵的步驟--sp_lock,sp_who

 

一般說道sqlserver調優,我們會首先想到,儲存過程,表,欄位型別,長度以及索引等。

 

今天,我不準備圍繞這幾個話題展開討論,就單獨說說,sp_lock,sp_who在資料庫調優中起到的作用。

 

SQL Server資料庫引擎為了保證每一次只有一個執行緒同時訪問同一個資源的物件而採用的一種鎖定機制,系統有大量鎖時就產生了“資料阻塞”。因此你的資料庫設計和程式編制應該科學和合理,以便讓sql server涉及的鎖定的數量降到最少。當你的系統的反應遲緩時就應該注意資料庫是否產生了阻塞。sp_lock是SQL Server 2000 的一個系統儲存過程,EXECUTE sp_lock 執行這個儲存過程,可以檢視當前阻塞的資料表,以便分析程式,解決問題。
當你執行sp_lock,之後,你會得到如下結果:
spid dbid ObjId IndId Type Resource Mode Status51 7 0 0 DB                                  S GRANT51 1 1131151075 0 TAB                        IS GRANT52 7 0 0 DB                                  S GRANT53 7 0 0 DB                                  S GRANT54 7 0 0 DB                                  S GRANT56 7 0 0 DB                                  S GRANT57 7 0 0 DB                                  S GRANT

 

這個程式會從主資料庫中的syslockinfo中返回與鎖定相關的大量資訊,而主資料庫是一個包括了所有允許、轉換和等待鎖定請求資訊的系統工作臺。

 

 

從上面的結果我們可以看到spid、dbid、objid、indid、type、resource、mode和status欄位。spid是程序標識號碼,用於識別到SQL伺服器的連線。要發現哪些使用者和該spid相連,你就要執行儲存過程sp_who,並將spid作為一個引數傳輸給該程式。dbid是鎖定發生的資料庫,你可以在主資料庫中的sysdatabases表格中找到它。欄位objid用來顯示在資料庫中鎖定發生所在的物件。要檢視這個物件,你可以在主資料庫中的sysobjects表格中查詢指定的objid。

在以上的螢幕截圖中產生的單一記錄並不一定能顯示正在你的工作環境中發生的真實情況。在執行這個程式時,你想要找到500到1000個甚至更多結果。每一次你執行sp_lock,都將有可能得到不同的結果,因為又發生了新的鎖定,而部分舊的鎖定已經被解除了。如果你發現sp_lock返回的結果中,大量的結果都有著相同的spid,很有可能該程序正在進行大型的處理,同時這些鎖定可能開始阻止新事務的發生。

當你發現一個spid 獲得了大量的資料庫鎖定時,這將有助於確定什麼儲存過程或語句正在執行。為了達到這個目的,執行以下 DBCC 命令:

檢查死鎖資訊

DBCC INPUTBUFFER(spid)

這個DBCC命令將返回正在EventInfo欄位中執行的語句的相關資訊,可以顯示正在執行的sql命令。

 

當你執行DBCC INPUTBUFFER(spid)之後,你會得到如下結果:

 

EventType Parameters EventInfo

 

你可以從EventInfo看到到底是哪一個程序或者查詢耗時比較長,容易產生死鎖。

 

你可以執行 dbcc checkdb 重建索引

 

如果你想看到更詳細的資訊:

 

select * from sys.objects where object_id = 0,檢視是由那個程序引起了效能問題,可能是約束,可能是表的資料引起的

 

select * from sys.sysdatabases where [dbid] IN(7,6,1,9),這個可以看出哪個資料庫死鎖的次數比較多