系統(tǒng)隱形殺手——阻塞與等待(SQL)
前言
應(yīng)用系統(tǒng)承載著大量的業(yè)務(wù),隨之而來的是復(fù)雜的業(yè)務(wù)邏輯,在數(shù)據(jù)庫上的表現(xiàn)就是有著大量的不同種類的SQL語句。
SQL語句執(zhí)行的快慢又與阻塞等待有著密不可分的原因。
系統(tǒng)慢可能有很多種原因,硬件資源不足,語句不優(yōu)化,結(jié)構(gòu)設(shè)計不合理,缺少必要的運維方式。所有的這些問題都可以在阻塞與等待中看出端倪,發(fā)現(xiàn)并解決問題。
今天這篇我們主要講述怎么樣發(fā)現(xiàn)并解決系統(tǒng)的阻塞和等待。
場景描述
您的系統(tǒng)是否有這樣的問題?
- 系統(tǒng)運行緩慢,很多功能需要幾十秒才能呈現(xiàn)結(jié)果,用戶體驗極差,領(lǐng)導(dǎo)們不斷施壓,作為系統(tǒng)的負(fù)責(zé)人,只知道系統(tǒng)慢又不知道慢在哪里?我們遲遲不能解決問題,領(lǐng)導(dǎo)已經(jīng)對我們怨聲載道了或者已經(jīng)慢習(xí)慣了,不再反饋了。
- 系統(tǒng)的功能運行緩慢,在生產(chǎn)環(huán)境中語句運行時間很長,但是在測試環(huán)境或者單獨拿出這條語句運行的卻很快?這好像不科學(xué)呀?
- 我對數(shù)據(jù)有較多的了解,我能查出系統(tǒng)的等待,但是我不知道這些等待意味著什么,百度的答案五花八門解決不了我的問題。
- 我能找到等待,也能解決這部分等待,但只是通過一些腳本,不能全面了解現(xiàn)狀,只能東一錘子西一棒子的游擊戰(zhàn)。
- 我是專家問題我都能解決,但不能給領(lǐng)導(dǎo)一個直觀的展現(xiàn)。
系統(tǒng)等待簡介
一個好的SQL語句就好比一輛時速180的好車,好的系統(tǒng)硬件(CPU,內(nèi)存,磁盤)就好比平坦寬闊的馬路??此坪密嚺浜寐罚欢梢蚤_的很快了!其實還忽略了一點!當(dāng)你駕駛一輛法拉利跑在北京寬闊的三環(huán)上,就算你是老炮中的“三環(huán)十二少“,早高峰你能開到多少? 北京的早高峰!北京的早高峰!
這個例子就引出了系統(tǒng)阻塞和等待的概念,紅燈(硬件等待,如IO等待),這就是正常的等待。另外一輛車在你前面不走了或開的很慢,那么你也只能等待(也可以說成你被他阻塞了)!
一張圖告訴你系統(tǒng)的主要等待類型及解決思路:
問題診斷
任何問題的診斷都要從全局的角度考慮,最忌諱的就是看到一個指標(biāo)高就冒然定位問題,然后以偏概全的去分析問題。
一個問題點可能涉及到很多部分,所以我們首先要從全局的角度定位系統(tǒng)問題,阻塞也是一樣,到底系統(tǒng)中存在哪些類型的阻塞,哪些是主因,哪些是關(guān)聯(lián)原因,哪些是次要的。
全局定位阻塞與等待
首先我們要關(guān)心數(shù)據(jù)庫中有哪些等待類型
注:這部分呈現(xiàn)的是系統(tǒng)中的等待情況,和使用腳本類似,已經(jīng)排除了不必要關(guān)心的類型,同時對等待情況進(jìn)行歸類統(tǒng)計。
橫坐標(biāo):等待類型
縱坐標(biāo):收集時間段內(nèi)出現(xiàn)的次數(shù)
知道了等到類型,我們要了解這些類型中,哪種占用了大量的時間:
注:各種等待類型所等待的時間也是排查的主要方向,結(jié)合等待類型與等待時間,我們能了解到:系統(tǒng)中有哪些等待,哪些等待比較嚴(yán)重,哪個最嚴(yán)重。
橫坐標(biāo):等待類型
縱坐標(biāo):平均等待時間
了解了主要的等待類型和時間,我們還要分析一下:什么數(shù)據(jù)庫來的?哪些程序來的?什么用戶請求導(dǎo)致的?什么時間阻塞最嚴(yán)重?
具體語句看等待
系統(tǒng)的整體等待情況了然于心,下面我們改看看具體哪些語句造成的等待,這也是解決問題的重要分析步驟。
哪些語類句等待最頻繁
注:這里我們可以根據(jù)等待次數(shù)、等待時間、消耗的各種資源排序,來多維度分析阻塞的語句類型
語句具體的等待情況時怎樣的呢?我們可以通過【原始視圖】查看具體語句在執(zhí)行過程中的真實阻塞情況
注:在阻塞的詳細(xì)視圖中我們可以清晰的看到語句的阻塞樹,并且可以看到阻塞的語句、時間、資源已經(jīng)阻塞等待的類型
阻塞樹:本例中【會話68】被【會話66】阻塞,而【會話66】又被【會話104】阻塞,這樣3個會話就構(gòu)成了一個阻塞鏈也叫阻塞樹
診斷結(jié)論
通過全局定位,語句類型分析,到具體的語句執(zhí)行阻塞狀態(tài),根據(jù)阻塞類型、次數(shù)、時間、連接程序、資源消耗等多種維度綜合分析,我們可以清楚的看出數(shù)據(jù)庫中的阻塞問題。
本例中系統(tǒng)主要的阻塞類型為CXPACKET和LCK_M_U,阻塞時間很長,主要的阻塞產(chǎn)生時間為上午十一點左右,主要的阻塞語句是一條update 和一個復(fù)雜的select查詢等信息。
問題解決
首先下面的這張圖已經(jīng)簡單的說明了系統(tǒng)對應(yīng)的等待需要怎么樣的解決思路?! ?/p>
注:根據(jù)不同的情況降低阻塞的辦法主要有:調(diào)整服務(wù)器、實例、數(shù)據(jù)庫配置參數(shù)(如:調(diào)整并行度),更改隔離級別(如:快照讀,nolock等),優(yōu)化語句(如:添加索引,優(yōu)化寫法等)
本例中主要的CXPACKET是因為實例并行度參數(shù)配置不佳而導(dǎo)致,LCK_M_U主要是一條update被一個批處理的另一條update阻塞鎖導(dǎo)致,優(yōu)化update這類更新語句主要是保證update語句最優(yōu)化,執(zhí)行時間盡量縮短,另外高并發(fā)下的update比較常見的解決辦法是使用索引利用key鎖取代表鎖以提高并發(fā),可能被更新的表只有幾十條記錄,添加索引與不加索引的并發(fā)效率差別也會很大。另外程序的設(shè)計也是非常重要的,各種奧秘各位看官只能在實際環(huán)境中慢慢體會了,而使用SQL專家云工具的主要目的在于全面的定位問題,圖表統(tǒng)計等形式清晰的展現(xiàn)問題,并根據(jù)工具提供的解決方案快速解決問題。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
t-sql/mssql用命令行導(dǎo)入數(shù)據(jù)腳本的SQL語句示例
這篇文章主要介紹了t-sql或mssql用命令行導(dǎo)入數(shù)據(jù)腳本的SQL語句示例,大家參考使用吧2013-11-11SQL Server 置疑、可疑、正在恢復(fù)等情況分析
有些時候當(dāng)你重啟了數(shù)據(jù)庫服務(wù),會發(fā)現(xiàn)有些數(shù)據(jù)庫變成了正在恢復(fù)、置疑、可疑等情況,這個時候DBA就會很緊張了,下面是一些在實踐中得到證明的方法2011-12-12深入學(xué)習(xí)SQL Server聚合函數(shù)算法優(yōu)化技巧
這篇文章主要深入學(xué)習(xí)SQL Server聚合函數(shù)算法優(yōu)化技巧,感興趣的小伙伴們可以參考一下2015-12-12sqlserver 觸發(fā)器學(xué)習(xí)(實現(xiàn)自動編號)
前段時間需要用觸發(fā)器做個實現(xiàn)數(shù)據(jù)插入表時自動編號的功能,于是再學(xué)習(xí)下觸發(fā)器,硬件備份共享于此,以供討論,以免遺忘2012-08-08如何解決在Azure上部署Sqlserver網(wǎng)絡(luò)訪問不了
這篇文章主要介紹了如何解決在Azure上部署Sqlserver網(wǎng)絡(luò)訪問不了的相關(guān)資料,需要的朋友可以參考下2015-10-10