性能優化實戰案例——助力某移動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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...