性能優化實戰案例——助力某移動OA系統

来源:http://www.cnblogs.com/double-K/archive/2017/01/18/6296320.html
-Advertisement-
Play Games

前言 最近連續接觸了4個OA系統,均存在著不同的性能問題,本文記述對某移動OA系統的優化全過程,讓看官們對資料庫優化流程有一個瞭解,並揭開隱式轉換這無情殺手的神秘面紗。 本文使用的工具:SQL專家雲平臺專業體檢工具 :www.zhuancloud.com 系統情況 硬體配置 軟體情況 資料庫情況 系 ...


前言

  最近連續接觸了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.是不是我伺服器有什麼問題了?

  

  在創意粘性的一本書中寫到“指揮官意圖”相關,其中有一個比喻就和這個很接近,如果排除其他干擾,就只是看這樣簡單的語句為什麼慢?這樣我們就是意圖明確,排除干擾,很快我們就會想到“隱式轉換”導致索引不能使用的情況,但是正是因為上面的一些問題干擾,我們可能會被引導到,是不是伺服器的問題,是不是阻塞情況我們有分析清呢?沒有太多辦法,資料庫本身就是這樣一個複雜的東西,各種因素的組合排查是最考驗從業者的智慧的。

 

  回到正題,“隱式轉換”確實是一個寫程式的人員很難發現的東西,因為我寫出的語句很快,到資料庫跑的時候慢,這我可不知道。

  如果不知道什麼是隱式轉換,請參見:SQL SERVER中隱式轉換的一些細節淺析

  但我們通過工具很清楚的分析出“隱式轉換”

  

  

 

  在之前的表定義中,我們可以看出表的欄位類型為varchar,而傳入的參數是nvarchar(從隱式轉換的提示中得知)

  

 

  支持一個簡單的問題得到定位,解決起來也是非常容易的,下麵給出幾個隱式轉換的常見解決方式:

  1.程式定義欄位類型與表定義不相符(優先順序高於表定義類型),直接修改參數設定類型

  2.程式沒有定義類型比如java程式定義string ,而驅動自動翻譯成nvarchar ,這樣一般可以在程式加入強制轉換 如 “where a = @a ” 改寫成 “where a = cast(@a as varchar(自定義長度))”

  3.程式如果很難修改,或第三方開發,可以直接修改表欄位類型 

性能對比

  經過1天的簡單優化程式性能得到明顯改善

  優化前

  

  優化後

  

 

  優化前

  

  優化後

  

 

--------------博客地址---------------------------------------------------------------------------------------

博客地址 http://www.cnblogs.com/double-K/

 

 歡迎轉載,請註明出處,謝謝!

-----------------------------------------------------------------------------------------------------

 

  總結 : 文章只是簡單的描述了一下某移動公司OA優化的過程,主要講述了隱式轉換部分的發現與處理,其他部分的優化都是常見手段請參見其他文章。

    SQL SERVER全面優化-------Expert for SQL Server 診斷系列

  

    關於隱式轉換的文章:SQL SERVER中隱式轉換的一些細節淺析

 ----------------------------------------------------------------------------------------------------

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 昨天下午突然看到,《爐石傳說》游戲資料庫發生宕機並引發數據丟失事故的新聞。剛看到時,滿滿的不可思議。暴雪啊,網易啊。 都是很牛叉的公司。他們出的游戲我都是很喜歡的。 當我看到,第一時間著手搶修,重啟伺服器,並嘗試數據恢復時,我的想法是他們的高可用方案呢?為什麼不馬上切換? 當我看到相關備份數據 ...
  • 介紹 經常會有人問profile工具該怎麼使用?有沒有方法獲取性能差的sql的問題。自從轉mysql我自己也差不多2年沒有使用profile,忽然profile變得有點生疏不得不重新熟悉一下。這篇文章主要對profile工具做一個詳細的介紹;包括工具的用途和使用方法等。profile是SQLServ ...
  • 今天公司編輯部有一妹紙,遇到問題,是需要處理資料庫中重覆的數據,於是想辦法幫忙解決,要求刪除重覆的數據,該表中只有一個欄位,假設為保存的公司名,這是經過多重過濾之後,最終留下的的數據,需要進行篩選,然後重覆的數據只保留一條,最上邊或最下邊的都可以,有且僅有一條,整張表的數據量大概在20W左右,重覆量 ...
  • ###11數據表中的數據類型 * A:MySQL中的我們常使用的數據類型如下 詳細的數據類型如下(不建議詳細閱讀!) 分類 類型名稱 說明 整數類型 tinyInt 很小的整數 smallint 小的整數 mediumint 中等大小的整數 int(integer) 普通大小的整數 小數類型 flo ...
  • 記得在自己學習資料庫知識的時候特別喜歡看案例,因為優化的手段是容易掌握的,但是整體的優化思想是很難學會的。這也是為什麼自己特別喜歡看案例,今天也開始分享自己做的優化案例。 最近一直很忙,博客產出也少的可憐,今天整理了一下自己做過優化或各種方案的客戶已經超過100家了,今天分享的案例算是在這些客戶中比 ...
  • Apache Flink是一個面向分散式數據流處理和批量數據處理的開源計算平臺,它能夠基於同一個Flink運行時,提供支持流處理和批處理兩種類型應用的功能。 現有的開源計算方案,會把流處理和批處理作為兩種不同的應用類型,因為它們所提供的SLA(Service Level Aggreement)是完全 ...
  • 編輯 用戶: SYSTEM 1.1, 1.2, 2.1, 2.2, 3.1, 3.2, 4.1, 4.2, 5.1, 5.2, 6.1, 6.2, 7.1, 7.2, 8.1, ...
  • 執行計劃顯示SQL執行的開銷 工具→ SQL Server Profiler : SQL Server 分析器,監視系統調用的SQL Server查詢 Top查詢 -- Top Percent 選擇百分比 SELECT top 30 percent * FROM [SchoolDB].[dbo].[... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...