您可以在最佳化資料庫查詢,升級資料庫伺服器,但仍不足以保證應用程式良好的資料庫效能.這是因為問題可能產生於系統中並發(指同步)地執行查詢操作.實際上,在產品化的資料庫系統中,同步執行查詢可能引發的問題是再多的查詢最佳化也不能解決的.我們可以有最佳化的、執行最快的查詢,但是,如果這些查詢因為並發問題得不到需要的資料,說明最佳化工作還做得不夠充分。
從根本上講,我們必須保證資料庫查詢和執行查詢的串連必須能夠在並發執行中沒有錯誤(如死結或更新衝突),並能在可接受的等待時間內得到結果.如果不能做到,就要定位並發問題並找出原因:為什麼獨立執行查詢時正確,並行執行階段就出問題.
解決並發問題的過程是一個基於經驗的過程.模仿產品環境並不容易,從許多同步串連中預測查詢操作並發時的行為也很難.這就是為什麼必須經常保留系統狀態,才能在並發問題發生時診斷問題的原因.
大多數情況下並發問題是一個SQL Server進程(或任務)等待某種資源,而這種資源還沒有被其他進程釋放.如果兩個進程串列,就不會有衝突;當它們並行時,對某種資源的衝突就產生了.這些等待大多由對使用者資源的鎖請求造成的.
在本章中,我們將會學習到解決並發問題的技術.概括地講,就是診斷和解決以下情況:鎖、阻塞和死結.基本的方法簡單明了:
● 識別並發問題;
● 分析和找出原因;
● 修改並解決問題.
使用這種方法需要我們熟悉相當多的背景資料.本章假設讀者已經閱讀或已經熟悉Kalen Delaney寫的Inside SQL Server 2005:The Storage Engine第8章“鎖和並發”中的內容(見本書參考書目中的引用:其他資源和引用).確切地說,那個章節包含必需的資料,關於SQL Server 2005中事務、隔離等級和鎖等解決並發問題需要的內容.
1、解決並發問題的新工具
SQL Server 2005增加了一些重要的解決並發問題的新工具.除了新增的工具,它仍然包含原來的一些工具,如sp_who2等系統預存程序、Perfmon計數器,解決並發問題的SQL Trace/Profiler工具等.
為了檢測和分析並發問題,SQL Server 2005包括了以下新工具:
DMV,特別是sys.dm_os_wait_stats和sys.dm_os_waiting_tasks.
加強的SQLDiag.exe功能,收集運行系統的資訊.
基於行版本的隔離選項(“快照”和“已提交讀快照”隔離等級).
新的1222跟蹤標識和SQL Trace檢測分析死結的“死結圖表”事件類別.
SQL Trace/Profiler中的被阻進程報告事件類別,和檢測長阻塞的“被阻塞進程閾值”伺服器配置選項.
新計數器 “SQLServer:Transactions Perfmon”對象,用來檢測“快照隔離”事務中的更新衝突,計算在tempdb中版本儲存的使用量.
目前,新工具中有兩個最基本的工具值得注意:用於檢測的sys.dm_os_waiting_tasks DMV和為了決議的基於行版本的隔離等級.在這裡我們只概括地進行介紹,講到解決問題的特定技術時再介紹更多的細節.
(1)新阻塞偵查工具:sys.dm_os_waiting_tasks
sys.dm_os_waiting_tasks是SQL Server 2005檢測並發問題阻塞類型最重要的新工具.這個DMV顯示所有任務的等待資訊.並不是所有等待任務都是阻塞的,因為任務可能等待I/O或記憶體授權.當一個任務等待另一個任務相對長時間時,它就會被阻塞.當一個任務A被另一個任務B阻塞,阻塞任務B將在視圖中顯示.
這個視圖的優點之一是它列出了任務和進程.任務表現出比SPID(伺服器處理序ID)更詳細的SQL Server執行細節.如果進程是並行的,一個給定的SPID可能包含一些同步任務;如果spid不是並行的,任務就只有一個spid.
導致任務等待的原因有很多,許多和並發沒有任何關係.所以從視圖中過濾出不相干的行很重要,從而可以更好地關注由於資源鎖定引起的阻塞問題.
(2)新阻塞決議工具:基於資料列版本設定的隔離等級
另一個主要的新工具由使用基於行版本的“快照隔離”選項組成,它減少了鎖的數量,從而減少阻塞和死結.確切地說,行版本可以減少或去除事務內外部的共用鎖定.因此,由於發行共用鎖定而可能被阻塞的查詢和事務就不再被阻塞了.和使用NOLOCK提示不同,這些查詢只會讀取已提交的資料.
使用基於行版本的隔離等級在某些方面有一定作用,包括tempdb中由於行版本增長的活動、使用某個或全部“快照隔離”選項時觸發器需要的代碼改動,以及使用SNAPSHOT隔離等級時DDL選項與可能丟失的更新之間的衝突.
2、並發問題的類型
當一個SQL Server進程或任務在等待時,它通常在等待某種被另一個SQL Server鎖定資源.最可能遇到的並發問題和鎖有關,包括下面的內容:
● 鎖定
● 阻塞
● 死結
● tempdb使用
● 更新衝突
前3種與以下內容相關:鎖定是SQL Server基本的並發機制,阻塞發生於一個任務必須等待被另一個任務鎖定資源時,死結發生於任務之間互相阻塞時.
列表中後面兩種產生於使用行版本.一般來說,我們可能看到增長的tempdb活動與行版本使用有關,可能還有一些效能問題與之相關.(我們可能也需要定位其他與tempdb相關的並發問題,例如與高頻率建立暫存資料表格相關的高tempdb活動性.)此外,當使用寫資料庫事務的“快照”隔離等級時,我們可能發現更新衝突的案例。