閱讀486 返回首頁    go 阿裏雲 go 技術社區[雲棲]


基於裸數據的異地數據庫性能診斷與優化

影響數據庫性能的因素有很多,從大的方麵可以分為硬件和軟件。硬件包括CPU、內存、存儲、網絡設備等,軟件方麵包括操作係統版本、操作係統參數、數據庫版本、數據庫參數、數據庫架構、運行的SQL代碼等。

以上因素中,運行的SQL代碼可單獨歸為一類,這部分內容多變,可控性較低,與業務強關聯,動態影響,難以準確捕獲,問題此消彼長難以根除。通過我們處理的故障類型統計,80%的性能問題來自於不良的SQL語句編寫。

生產環境常做訪問控製,管理生產環境DBA忙於日常事務無法顧及數據庫性能。本文介紹一次性從生產庫上獲取分析性能SQL相關的數據,拿到本地環境分析診斷生產性能問題。

裸數據獲取

較詳細分析一個SQL的性能,需要的內容包括執行計劃信息、表的基礎信息、索引基礎信息、SQL寫法問題等等。這些內容都存放在數據字典中。

1、創建相關的表,語句參考:

3bde969dc2a52d62f5dba76a87c81b78afaac67e

注:(第三條、第四條紅框處,沒有* 是因為這兩個視圖裏麵有long類型,不支持create as ct操作,實際操作過程中,未獲取long類型的數據,隻選取了必要的列)

2、通過數據泵導出上述創建的表

3、導出AWR裸數據

$ORACLE_HOME/rdbms/admin/awrextr.sql

4、本地導入創建的表

5、通過數據泵導入AWR裸數據

$ORACLE_HOME/rdbms/admin/awrload.sql


1、執行時段為10~12點,15~17點,平均執行時長超過1秒的SQL統計。多個采樣期間都有執行的,取執行次數最多的采樣期間。

ab5b36943cc0fc8faf5f001cd2ec193ad9a1b7af

2、執行結果部分展示如下:

64f053fb50340d9cef7a910ddad92099b8dfc52d

3、生成這獲取這此SQL的SQLAWR數據腳本(取前20)

fb223b84d60e8181d85e86e55ec862608722ed2a

4、生成結果放入命令窗口執行

6826068b7c8640a5758487c79995959bbef0b7c6

注:紅框為格式化操作

5、生成結果展示如下

8581b8c1d9b0af945d063baab39d2b8ccf6b722d


案例解析

NEW_TOP_PHYSICAL_16_awr_sqlrpt_dqdx4x39x2x7m.html

SQL文本

SELECT COUNT(1)
FROM GPCXXXXXXXX A
WHERE A.VALIDDATE < :B1
AND A.SUBMITDATE < :B1
AND A.SUBMITDATE >SYSDATE - 40
AND A.FEETYPE IN ('307')
AND A.PLANSTATUS = 'N'
AND ROWNUM = 1;

f59a4135195c6ed047f7a20780a233ba1e8e07c3


  1. 小時內還未執行完一次,但占用整個采樣期間8.21%的物理讀,並伴有嚴重的IO等待,對采樣期間數據庫整體性能有較大影響
  2. 執行計劃中存在全表掃描操作
  3. 語句簡單易懂

表基礎信息

2493238c253cf89fe2a8c138c209f6d2cca123f2

近3億行,未分區,平均行長149,理論占用空間大小為 296815739*149*1.17/1024/1024/1024=48G,實際占用約50G空間(從MY_DBA_SEGMENTS中獲取),知此表碎片並不嚴重或不存在碎片。

SQL綁定變量分析

20ce40a4e7d6bd23ecd0ab02d4675fbb2f70488c

結合綁定變量和條件看,大範圍上,隻查詢40天以內的數據。

條件列數據分布情況

14d177cd2d110b25044360fde7ea32951c93c462

回顧下SQL條件:

WHERE A.VALIDDATE < :B1
AND A.SUBMITDATE < :B1
AND A.SUBMITDATE > SYSDATE - 40
AND A.FEETYPE IN ('307')
AND A.PLANSTATUS = 'N'
AND ROWNUM = 1;

結合條件和上述查詢結果,分析如下:

FEETYPE,PLANSTATUS是等值關聯,VALIDDATE是開區間範圍關聯,SUBMITDATE是閉區間範圍關聯。已知此表中SUBMITDATE保留3年數據,在數據分布平均的情況下,此SQL查詢的數據量約為(296815739/3/365)*40/25/2=21.7W,約占整個表的0.07%。理論上適合使用索引,不必要全表掃描。

索引情況分析

9d67232c1a664536f4398c83bca755027b550d4d

  1. 此表當前存在3個組合索引4個單列索引
  2. 其中前三個索引實則過濾性極差,索引的NDV值僅2個或者3個,除非值嚴重分布不均,同時又經常選取值少的部分,不然這類索引沒有存在的必要
  3. 結合本例子SQL,涉及的列上均沒有索引,建立FEETYPE, SUBMITDATE兩列組合索引,理應提升SQL性能


  1. 建立FEETYPE, SUBMITDATE組合索引,執行SQL執行時長縮短到10S以內
  2. 表按SUBMITDATE分區,數據按月存放數據

原文發布時間為:2017-11-15
本文作者:楊江
本文來自雲棲社區合作夥伴“數據和雲”,了解相關信息可以關注“數據和雲”微信公眾號

最後更新:2017-11-15 14:05:54

  上一篇:go  30歲程序員的選擇,一線OR二線?
  下一篇:go  Radware:醫療行業數字轉型的5大關鍵注意事項