用sp lock診斷SQL Sever的效能問題

2022-01-12 16:28:12 字數 1747 閱讀 1497

在it專家中有一種普遍的誤解,就是認為「鎖定是不好的東西」,你必須盡一切可能保證資料庫鎖定不會使得程序無法正常執行。為了能夠確保乙個一致的資料庫環境,在對資源進行修改時,資料庫引擎必須利用一種機制來獲得對資源的獨占權。

sql server中也用鎖定,它們是指為了達到這種一致性,資料庫引擎用來保證每一次只有乙個執行緒同時訪問同乙個資源的物件。如果不用鎖定的話,各個程序同時進行資料修改就可能發生,這就會使資料庫處於一種不一致的狀態。這樣看來,鎖定就成了好東西;但是,你應該以特定的方式來計畫你的應用程式,讓涉及的鎖定的數量降到最少。在這篇文章中,我將討論乙個讓你能夠分析資料庫鎖定問題的儲存過程。

找出什麼被鎖定了

系統的反應遲緩意味著你應該做一些調查了。你的查詢最好從測定系統發生鎖定的數量和頻率開始。如果你的系統環境處理事務性很高的話,這樣各個應用程式爭奪資源就會很常見,從而引起鎖定。解決這些問題的關鍵就在於能夠確定被鎖定的資源和爭奪資源的程序。

sp_lock

sp_lock這個系統儲存過程與sql server 2000 打包在一起,它將使你對在你系統中發生的鎖定有深入的了解。這個程式會從主資料庫中的syslockinfo中返回與鎖定相關的大量資訊,而主資料庫是乙個包括了所有允許、轉換和等待鎖定請求資訊的系統工作台。

讓我們來看一下執行sp_lock 程式之後,它會為我們提供什麼資訊:

execute sp_lock

在我的系統中,這是該儲存過程返回的內容。sp_lock 返回的資訊並不是一目了然的,要獲得有用的資料,還需要做一些查詢。但是,你也可以複製該儲存過程的文字,然後建立乙個新的,從而得到關於系統程序的更好的解釋。(在這篇文章中,我們將集中討論sp_lock返回的資料。)

從上面的結果我們可以看到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欄位中執行的語句的相關資訊。

乙個可靠的起點

系統執行緩慢可能說明你的**上有大量的鎖定。造成這些鎖定的原因較多,如某個使用者正在你的系統中執行乙個相當長的查詢,乙個程序占用大量資源或者兩個關鍵程序爭奪同一資源,經常造成死鎖。一旦發現你認為正在減緩你系統速度的程序,應該怎麼辦?在大多數情況下,不能採取任何措施,只能監控系統。結束這個程序並不是明智之舉,因為它包括了很多系統鎖定,除非你完全肯定不會有其他的負面影響。不然的話,你就應該想辦法自動分析鎖定狀況。還有乙個解決辦法就是想出一種方法,使得在一天的特定時間內,當系統鎖數量達到極限時,發出通知。你對自己的系統資訊收集的越多,在解決問題時,你的優勢就越大。

用sp lock診斷SQL Sever的效能問題

在it 專家中有一種普遍的誤解,就是認為 鎖定是不好的東西 你必須盡一切可能保證資料庫鎖定不會使得程序無法正常執行。為了能夠確保乙個一致的資料庫環境,在對資源進行修改時,資料庫引擎必須利用一種機制來獲得對資源的獨占權。sql server中也用鎖定,它們是指為了達到這種一致性,資料庫引擎用來保證每一...

sp lock診斷Sql Server的效能問題

伺服器學院 在it專家中有一種普遍的誤解,就是認為 鎖定是不好的東西 你必須盡一切可能保證資料庫鎖定不會使得程序無法正常執行。為了能夠確保乙個一致的資料庫環境,在對資源進行修改時,資料庫引擎必須利用一種機制來獲得對資源的獨占權。sql server中也用鎖定,它們是指為了達到這種一致性,資料庫引擎用...

用SQL TRACE對Oracle進行診斷(一)

生成trc檔案後查詢可以通過資料字典表看到trace檔案的位置 select d.value lower rtrim i.instance,chr 0 ora p.spid trc trace file name from select p.spid from v mystat m,v sessio...