資料庫優化案例——————某市中心醫院HIS系統

来源:http://www.cnblogs.com/zhuancloud/archive/2017/01/18/6297904.html
-Advertisement-
Play Games

記得在自己學習資料庫知識的時候特別喜歡看案例,因為優化的手段是容易掌握的,但是整體的優化思想是很難學會的。這也是為什麼自己特別喜歡看案例,今天也開始分享自己做的優化案例。 最近一直很忙,博客產出也少的可憐,今天整理了一下自己做過優化或各種方案的客戶已經超過100家了,今天分享的案例算是在這些客戶中比 ...


  記得在自己學習資料庫知識的時候特別喜歡看案例,因為優化的手段是容易掌握的,但是整體的優化思想是很難學會的。這也是為什麼自己特別喜歡看案例,今天也開始分享自己做的優化案例。

  最近一直很忙,博客產出也少的可憐,今天整理了一下自己做過優化或各種方案的客戶已經超過100家了,今天分享的案例算是在這些客戶中比較典型的了!沒有什麼高大上都是常見的問題!在之前的博客中都有過提及,那麼本篇我們就結合之前的技術點來看看這個案例。學習優化手段的看官們可以參見我的優化系列:

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

 

系統環境

  首先我們來看一下這個系統配置及現狀,為什麼說這個客戶經典?那就是因為這個客戶已經達到可以慢的地方都慢,不該慢的地方也慢!

  首先這是一套醫院的HIS系統,慢到什麼程度呢?各種功能卡死不管是交款、醫囑、開藥一些列幾乎所有的功能都慢。但是卡慢的現象只出現在上午的高峰期!

  先來看看系統配置 :

  

  

   

 

  資料庫版本是SQL SERVER 2008R2,數據量大概1個多T,伺服器64CPU 、128G記憶體,伺服器只運行資料庫。

  咋一看伺服器確實有點老了,數據量也大了,記憶體和CPU什麼的明顯不夠用了!

資料庫指標

  那麼我們再看一下資料庫的一些表象:

  每秒請求數量:

  

  語句執行情況:

  

  等待情況:

  

  等待時間:

  

   CPU指標:

  

  記憶體一些指標:

  

  磁碟隊列:

  

 

 -------------------還很多指標就不一一展示了------------------

 

   看到這些基本的指標,除了慢你能看出什麼?問題出在哪裡?怎麼樣快速解決?能有一個優化的步驟呈現在眼前麽?

優化階段一(常規優化)

  很多時候系統慢要究其原因,難道上線時候就這麼慢?那不可能,廠商根本無法交付的!那麼問題來了,什麼時候開始慢的?對系統做過哪些調整?

  簡單的調研開始...給我的只有不到半天的調研時間...得知的基本問題就是系統在最近一月增加了很多功能,有上線了很多其他系統介面!

  那麼直接就搞新功能、新程式介面語句? 我認為並不是這樣,從一名資料庫從業人員來說,看到這樣的系統一定要先解決大面積等待問題!個人經驗來看很多系統大面積等待解決系統會有個很大的提升和改善!

  配合一些常規的調優手段階段一開始了,主要給系統大面積創建影響高開銷大的索引,調整系統參數,優化tempDB、開啟快照讀等....具體不細說了,前面系列文章中都有!

 

  預期:

  一般系統上面一輪優化會有明顯的改善,我認為這一輪以後系統會明顯變快,語句CPU會下降到70%左右,記憶體壓力也會有所減少。

  結果:

  自信滿滿的我第二天去了各個科室....部分功能依然超時還是各種慢...CPU依然90%以上,記憶體壓力依然明顯。但是收集的數據來看,長時間語句數量已經大幅降低,系統等待阻塞情況也明顯好轉。

  

  優化前

  

  優化後

  

  優化前

  

  優化後

  

  

優化階段二(針對語句)

   再次分析解決大面積語句阻塞的系統,發現現在的情況,主要有如下幾個:

  1. 由於記憶體不足導致的IO壓力。
  2. 系統CPU依然彪高。
  3. 部分功能語句依然慢,消耗的資源很高。

  再次對系統調研:

  1. 哪些功能慢,執行的語句是什麼。
  2. 系統的介面語句問題。
  3. 系統中還有哪些消耗資源高的語句,是否能優化。  

  

  調研後,我遇到了最常見也是最大的問題: 語句慢由於程式!很多人看到這會說程式慢就改唄,那有啥問題? 問題就在於你來做優化直接了當的和人家開發人員說你程式太爛必須改!如果你是程式開發人員你會有什麼樣的反應?

  他會說:對不起,影響太大改不了!

  那麼這個優化項目黃了,或者你要付出更大的代價繞過這樣的問題。

 

 

   分析中發現程式使用了大量各種自定義函數,有一定經驗的人都應該知道,語句在篩選的列上使用函數是沒有辦法使用索引查找的,這樣相對於這種單表數據就幾百甚至幾千萬的表,是何等的災難!但是不能冒然突出修改程式,那還能怎麼優化呢?大概分析後得出結論,程式主要消耗在幾部分:

  1. 部分業務功能語句慢。
  2. 介面語句慢(主要是視圖,供其他程式調用)。
  3. 還有報表程式。

 

  針對第一部分在不能改程式的情況下,嘗試添加計劃嚮導改變語句執行情況;

  針對第二部分修改介面視圖,包括替換掉函數、添加索引等;

  針對第三部分報表這東西不是短期就可以優化的,所以再原有鏡像的方案上添加快照,實現了簡單的讀寫分離,直接分走;

  

  語句優化的效果:

  優化前

  

  優化後

  

  優化前

  

  優化後

  

  

 

   預期:

  90%消耗高的語句都得到了優化,系統應該可以快起來了,CPU、記憶體指標也應該正常了!

   結果:

  語句的消耗和時間都降下來了,系統卡慢現象有明顯好轉,但是CPU依然90%以上、記憶體壓力依然明顯,磁碟隊列還是很高!系統性能問題依然存在。

優化階段三(深入指標分析)

  經過前兩個階段的優化一般系都會明顯好轉,並且指標正常,這也是前面提到的可以慢的地方慢已經解決,那麼為什麼CPU、記憶體壓力沒有緩解?難道真的是64CPU、128G記憶體不能支持了?需要加記憶體換CPU?難道要做負載均衡?各種拆分?

CPU分析

  首先我對CPU壓力進行了分析,綜合語句的CPU消耗和CPU的表象來看,很大一部分應該不是語句執行消耗的!那麼伺服器上確實也沒有跑其他程式,CPU資源哪裡去了?

  看看這個計數器:

  

 

  SQL的編譯次數高峰時間段達到每秒2000多次!很多書上寫過,相信很多看官也知道,語句不參數化會給CPU造成壓力,這就是個鮮活的例子!那麼解決辦法也是比較粗暴,程式無法修改那麼就在資料庫上開啟強制參數化。

  看下效果:

  

  

 

   我想不用多說什麼了!

  

記憶體分析

  看到了CPU的現象那麼記憶體的問題也有眉目了,這麼多編譯即席查詢,首先看一下記憶體中緩存了那些數據:

  

 

  SQLOPTIMIZER Singlepage占到了80多個G,而在查詢數據頁的緩存只有20個G,而且仍然在被不斷壓縮,那麼記憶體沒壓力就怪了!這個SQLOPTIMIZER Singlepage嘗試了一下是無法通過DBCC FREExxxxx的操作釋放的,所以在半夜直接重啟了SQL 服務!將近2年沒有重啟的SQL服務就這麼折在我的手裡了!

   重啟後頁生命周期:

  

  

  記憶體這個問題,不知道是不是微軟的一個小BUG,查詢計劃的緩存個人理解不會一直壓榨數據緩存的,客戶的資料庫沒有補丁,但是查閱08的各個補丁也沒有找到相關問題的修複。

  也請遇到過或瞭解的朋友給點提示!

 

  預期:

  語句已經優化,阻塞情況也被解決,CPU、記憶體、磁碟壓力也沒有了,系統肯定快起來了!

  結果:

  系統快起來了!

 

 

 

  總結 : 文章只是簡單的描述了一下某醫院HIS系統的優化過程,當然一周的工作僅僅通過一篇文章寫出全過程細節必然不那麼詳盡,還望看官們見諒!

      整個的優化過程是程式只修改了2條語句,其他都是通過資料庫優化手段完成。而且沒有添加任何硬體資源!

優化過程主要分為:

  1. 系統整體調研 :和科室用戶溝通慢的情況,系統最近變更情況,並收集數據。
  2. 常規優化 : 調整資料庫參數配置,添加索引,解決阻塞。
  3. 再次調研:系統慢功能,慢語句。
  4. 針對語句優化:寫法不足,是否缺失索引,是否能加提示、計劃嚮導等
  5. 整體壓力是否緩解:如果仍然壓力很大找到瓶頸,是否可以解決?如果不能解決才考慮添加硬體或選用分離、分離等方案。

 

 文章用用到的 Expert FOR SQLSERVER 工具下載鏈接:http://zhuancloud.com/ReceptionViews/Install.html

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

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


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

-Advertisement-
Play Games
更多相關文章
  • //獲取當前的時間 +(NSString*)getCurrentTimes{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 設置你想要的格式,hh與HH的區別:分別表示12小時制,24小時制 [formatter se ...
  • Java IO流學習總結一:輸入輸出流 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/54292148 本文出自 "【趙彥軍的博客】" Java流類圖結構: 流的概念和作用 流是一組有順序的,有起點和終點的位元組集合,是對數據傳輸的總 ...
  • 有的 App 可能有切換語言的選項,結合系統自動切換最簡單的辦法: 代碼說明: 1、"Localizable" 指的是 Localizable.strings 2、"zh-Hans" 這裡強制指定中文 3、如果強制指定就用上面的代碼,否則可以直接用 NSLocalizedString(key, co ...
  • http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html ...
  • 概述 昨天下午突然看到,《爐石傳說》游戲資料庫發生宕機並引發數據丟失事故的新聞。剛看到時,滿滿的不可思議。暴雪啊,網易啊。 都是很牛叉的公司。他們出的游戲我都是很喜歡的。 當我看到,第一時間著手搶修,重啟伺服器,並嘗試數據恢復時,我的想法是他們的高可用方案呢?為什麼不馬上切換? 當我看到相關備份數據 ...
  • 介紹 經常會有人問profile工具該怎麼使用?有沒有方法獲取性能差的sql的問題。自從轉mysql我自己也差不多2年沒有使用profile,忽然profile變得有點生疏不得不重新熟悉一下。這篇文章主要對profile工具做一個詳細的介紹;包括工具的用途和使用方法等。profile是SQLServ ...
  • 今天公司編輯部有一妹紙,遇到問題,是需要處理資料庫中重覆的數據,於是想辦法幫忙解決,要求刪除重覆的數據,該表中只有一個欄位,假設為保存的公司名,這是經過多重過濾之後,最終留下的的數據,需要進行篩選,然後重覆的數據只保留一條,最上邊或最下邊的都可以,有且僅有一條,整張表的數據量大概在20W左右,重覆量 ...
  • ###11數據表中的數據類型 * A:MySQL中的我們常使用的數據類型如下 詳細的數據類型如下(不建議詳細閱讀!) 分類 類型名稱 說明 整數類型 tinyInt 很小的整數 smallint 小的整數 mediumint 中等大小的整數 int(integer) 普通大小的整數 小數類型 flo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...