1. 程式人生 > >輕鬆精通資料庫管理之道——運維巡檢之三(結構設計)

輕鬆精通資料庫管理之道——運維巡檢之三(結構設計)

前言

  做好日常巡檢是資料庫管理和維護的重要步驟,而且需要對每次巡檢日期、結果進行登記,同時可能需要出一份巡檢報告。

  本系列旨在解決一些常見的困擾:

  • 不知道巡檢哪些東西
  • 不知道怎麼樣便捷體檢
  • 機器太多體檢麻煩
  • 生成報告困難,無法直觀呈現結果

  前面兩篇對伺服器軟硬體配置、資料庫概況進行了巡檢,下面我們要對資料庫的一些結構設計進行檢查,這些檢查主要針對系統開發初期一些不優化的結構設計或在系統不斷有新功能增加或運維變動而產生的結構變化。

物理結構概覽

  在【檢查項】-【全部】中檢視每個資料庫的資訊,當資料庫結構未通過常規檢查,平臺會提示出警告。

  注:檢查資訊主要包含不規範的表、缺失索引、無索引外來鍵、沒有使用的索引、重複索引、老化的索引。

  

  

不規範的表

  在【資料庫】-【不規範的表】中檢查系統中表是否存在有不規範設計。這些不規範設計主要包含無聚集索引,使用舊資料型別,聚集索引的列是隨機增長的(GUID,uniqueidentifier型別)

  注:

  1.微軟建議在表中都建議有聚集索引。聚集索引除了可以提高查詢效能之外,還可以按需重新生成或重新組織來控制表碎片。

  2.在 Microsoft SQL Server 的未來版本中將刪除 ntext、text 和 image 

  3.聚集索引本身是要排序的,而GUID(uniqueidentifier型別)這樣插入資料時導致過多的頁拆分。

  

缺失索引

  (圖略)

  資料庫設計中索引是效能的一大關鍵,當資料庫缺失大量索引,那麼也必然導致資料庫的效能很差。

無索引外來鍵

  (圖略)

  • 對主表資料操作時(如刪除),需要到外來鍵表中查詢校驗,如果缺少外來鍵索引可能導致全表掃描,嚴重影響效能。

  • 當在查詢中組合相關表中的資料時,經常在聯接條件中使用外來鍵列,方法是將一個表的 FOREIGN KEY 約束中的列與另一個表中的主鍵列或唯一鍵列匹配。索引使 資料庫引擎可以在外來鍵表中快速查詢相關資料,提升效能。

沒有使用的索引

  (圖略)

  隨著開發和優化的進行,很多人會對資料庫進行索引的建立操作,很多時候建立了一個較優的聯合索引或者覆蓋索引,會讓原本單列的索引失去使用的場景,這部分索引會出現在,長時間未使用的索引中,建議刪除。

重複索引

  (圖略)

   隨著開發和優化的進行,很多人會對資料庫進行索引的建立操作,那麼頁難免會產生一些功能相近或相同的索引,索引本身也是有維護成本,在更新、插入、刪除時會有一定的開銷,那麼重複的索引只會增加這部分維護開銷。

老化的索引

  (圖略)

  索引維護是配置常規維護任務之一,隨著資料的不斷寫入和變更,會產生大量的索引碎片,缺少維護任務的索引,無法及時重新組織索引資料,導致索引低效,甚至失效。

程式設計結構概覽

  1.在【檢查項】-【結構設計】中檢視會話資訊和執行計劃,當設計結構未通過常規檢查,平臺會提示出警告。

  注:檢查資訊主要會話隔離級別、是否存在帶有事務的長時間會話、執行計劃中是否存在隱式轉換。

  

 會話資訊

  1.在【會話】-【空閒會話】中檢視會話資訊。

  注:主要關注,長時間未關閉會話和長時間未關閉並帶有事務的會話。長時間帶有事務的會話可能是因為程式連線洩露導致,長時間帶有事務會阻塞其他會話的正常進行,造成系統卡死等嚴重效能問題。

  2.在【會話】-【概覽】頁中檢視會話詳細資訊,主要關注事務隔離級別。

  事務隔離級別簡述:事務隔離級別主要控制查詢(共享鎖),隔離級別越高併發能力就越差。(詳細資訊請參見:平臺技術資料,最佳配置)

  如果在程式中發現大量REPEATABLE_READ(可重複讀)或SERIALIZABLE(可序列化),請檢查程式是否有必要使用高級別的隔離級別,而導致阻塞等待增加,資料庫併發能力下降。   注:如果在系統中存在大量高級別的事務級別,請確認是否需要高的隔離級別而犧牲併發能力。

  

隱式轉換

  存在隱式轉換的執行計劃:語句存在隱式轉換導致效能消耗,或不能使用索引。

  注:隱式轉換常發生在表設計的欄位型別(varchar)優先級別低於程式傳遞的引數型別(nvarchar)

  在【執行計劃】-【隱式轉換】頁中檢視具體資訊。

 

總結

  整個程式和資料庫是否穩定、高效和結構設計的好壞密不可分,在巡檢過程中,結構設計時比較重要的一部分。很多時候運維人員和設計人員、開發人員溝通不暢、專業技能有差距,所以結構設計常常出現問題。