效能優化實戰案例——助力某移動OA系統
前言
最近連續接觸了4個OA系統,均存在著不同的效能問題,本文記述對某移動OA系統的優化全過程,讓看官們對資料庫優化流程有一個瞭解,並揭開隱式轉換這無情殺手的神祕面紗。
本文使用的工具:SQL專家雲平臺專業體檢工具 :www.zhuancloud.com
系統情況
硬體配置
軟體情況
資料庫情況
系統情況可以看出,這是一個較小型的OA系統資料大小70G,硬體配置較為普通2路16CPU、48G記憶體,資料庫為2008R2版本。
資料庫指標
我們來看一下資料庫的效能相關情況:資料是從早上九點半到晚上8點的資料
每秒請求數:
使用者連線數
慢語句數量
系統等待情況
等待時間
CPU、記憶體、磁碟指標一切正常,還有很多指標,這裡就不貼圖了。
其實看到這裡,大多數看官可以得出結論,硬體指標正常,阻塞這麼嚴重,系統的慢主要是因為阻塞!並且語句執行時間長也是因為阻塞的時間長!
我的猜測
OK 沒問題就是這樣的定位,同樣我們看到大量的阻塞型別是LCK_M_IS、LCK_M_S、LCK_M_U ·····有了這樣的定位,我可以猜測到,系統中一定有update語句不優化或太過頻繁(OA這樣的系統一般不會特別頻繁,所以一定是不優化),而且設計核心的查詢語句經常被阻塞(如果不是核心功能慢,使用者也不會這樣大叫!),而且80%的可能這部分核心查詢也不夠優化!
問題診斷
帶著我的猜測我們看一下核心的一些語句:
很多語句都類似,看到這樣的簡單語句(都是基本的查詢幾個欄位一個where條件),我就知道問題其實一定很簡單!
如此簡單的語句設計那麼跑出來是多長時間呢?
很多人想到著一定是缺失索引,這樣關鍵的where 條件上沒有索引!!!!!
看一下結構:
這個表是一個有280萬資料的表,而不是像我們想象的那樣缺失索引,相反where欄位上的條件是一個聚集索引!!(其實如果只是條件單純的缺失索引,技術人員怎麼可能發現不了?)
整個系統其他問題不大,也就是說明,系統經過優化,程式設計的也很好,沒有那種非常複雜的SQL,都是拆成一步一步很簡單SQL,也就是說明這其中的技術人員水平還是很可以的!
那麼問題來了,這是啥問題導致的?
可能出現的情況是:
1.我這條簡單語句不缺少索引,而且單獨在資料庫跑很快很快(這是一定的)
2.我係統中阻塞的這麼嚴重,是不是有什麼地方我沒發現?怎麼這樣的語句會阻塞的這麼狠?
3.是不是我伺服器有什麼問題了?
在創意粘性的一本書中寫到“指揮官意圖”相關,其中有一個比喻就和這個很接近,如果排除其他干擾,就只是看這樣簡單的語句為什麼慢?這樣我們就是意圖明確,排除干擾,很快我們就會想到“隱式轉換”導致索引不能使用的情況,但是正是因為上面的一些問題干擾,我們可能會被引導到,是不是伺服器的問題,是不是阻塞情況我們有分析清呢?沒有太多辦法,資料庫本身就是這樣一個複雜的東西,各種因素的組合排查是最考驗從業者的智慧的。
回到正題,“隱式轉換”確實是一個寫程式的人員很難發現的東西,因為我寫出的語句很快,到資料庫跑的時候慢,這我可不知道。
但我們通過工具很清楚的分析出“隱式轉換”
在之前的表定義中,我們可以看出表的欄位型別為varchar,而傳入的引數是nvarchar(從隱式轉換的提示中得知)
支援一個簡單的問題得到定位,解決起來也是非常容易的,下面給出幾個隱式轉換的常見解決方式:
1.程式定義欄位型別與表定義不相符(優先順序高於表定義型別),直接修改引數設定型別
2.程式沒有定義型別比如java程式定義string ,而驅動自動翻譯成nvarchar ,這樣一般可以在程式加入強制轉換 如 “where a = @a ” 改寫成 “where a = cast(@a as varchar(自定義長度))”
3.程式如果很難修改,或第三方開發,可以直接修改表字段型別
效能對比
經過1天的簡單優化程式效能得到明顯改善
優化前
優化後
優化前
優化後
--------------部落格地址---------------------------------------------------------------------------------------
歡迎轉載,請註明出處,謝謝!
-----------------------------------------------------------------------------------------------------
總結 : 文章只是簡單的描述了一下某移動公司OA優化的過程,主要講述了隱式轉換部分的發現與處理,其他部分的優化都是常見手段請參見其他文章。
----------------------------------------------------------------------------------------------------
注:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文連結!
若您覺得這篇文章還不錯請點選下右下角的推薦,非常感謝!