第一章 被埋沒的SQL優化利器——Oracle SQL monitor
DBAplus社群 | 2015-11-26 07:00
轉載聲明:本文為DBA+社群原創文章,轉載必須連同本訂閱號二維碼全文轉載,並注明作者名字及來源:DBA+社群(dbaplus)。
據說,在Oracle企業版數據庫中有一個免費的工具,乃SQL優化之利器,那就是Oracle SQL monitor。下面,由DBA+社群原創專家周俊,給大家科普一下這一被埋沒的神器。
專家簡介
周俊
DBA+社群原創專家
具有14年以上Oracle數據庫技術支持經驗,在IBM的7年間擔任華東區非IBM logo產品技術支持團隊team leader,同時是IBM中國區Oracle 軟件支持服務的技術負責人。目前任職於Oracle公司,專注於Oracle數據集成方案設計和實施。獲得Oracle 8i~11g OCP、Oracle 10g OCM、DB2 administrator、PMP等證書。
一前言
說實話,我以前也不太愛用花哨的圖形界面工具進行SQL優化,最近參加了Oracle RWP培訓,我發現Oracle 11g 引入的SQL monitor確實蠻好用的,是個被埋沒的SQL優化利器。最重要的是Oracle SQL monitor在Oracle企業版數據庫中是免費供大家使用的。下面我和大家分享如何利用SQL monitor簡化我們的SQL優化工作。
二如何打開SQL monitor report
方法一
Step1:打開Oracle EM console主頁,切換到性能頁面,點擊右下角的SQL監控。
Step2:選擇 時間范圍,可以按照持續時間或者數據庫時間對SQL語句進行排序。
在Oracle 11g中,當SQL滿足以下條件之一就會被sql monitor捕獲到,監控數據被記錄在v$sql_monitor視圖中。
當SQL並行執行時,會立即被實時監控到
當SQL單進程運行時,如果消耗超過5秒的CPU或I/O時間,它也會被監控到
使用/*+ monitor */提示的sql語句
Step3:選擇您想要進行SQL優化語句前,點擊第一列狀態欄中勾號,Oracle就會將該SQL語句的執行情況華麗麗的展現在您面前。
方法二
在性能頁面左下角的頂級會話中,點擊您想要查看的SQL語句ID。
在SQL監控頁面點擊第一列狀態欄中的圖標。
方法三
如果您沒有配置Oracle EM,但是知道待優化SQL語句對應的SQLID,可以通過以下腳本利用SQL monitor查看SQL語句在數據庫中真實的執行計划。
在SecureCRT中啟用log跟蹤,選擇保存的日志文件(后綴html)
在SQLPLUS 中執行
set trimspool on
set arraysize 512
set trim on
set pagesize 0
set linesize 1000
set long 1000000
set longchunksize 1000000
spool sqlmon.html
select /*+ noparallel */ dbms_sqltune.report_sql_monitor (sql_id=>'input your SQL ID', report_level=>'ALL', type=>'ACTIVE') from dual;
spool off
cat sqlmon.html
在SecureCRT中關閉log跟蹤,打開保存的文件就可以看到SQL執行計划了。
三如何利用SQL monitor進行SQL優化
使用SQL monitor打開SQL執行計划后,
我們通常會根據最右邊CPU和wait的activity,找到SQL執行計划中資源消耗較高的步驟。
然后查看一下Oracle估算的返回行數和實際的返回行數是否相差很大,如果估算的行數和實際的行數相差不大,至少表明目前對應數據庫對象上的統計信息是准確的。
本例中Oracle估算的返回行數和實際返回行數相差不大,Oracle優化器采用了布隆過濾和HASH 右連的執行計划,接下去我們通常會檢查SQL的篩選條件,判斷是否使用了正確的索引等優化手段,這里我就不一一展開了。
下面是我最近遇到的一個利用SQL monitor進行快速SQL優化的案例分享。
SQL Text:SQL語句比較長 ,我截選了其中部分有代表性的SQL。
利用SQL monitor我們可以在執行計划中快速的定位需要重點關注的步驟。
我們看到該SQL語句已經運行了5.4小時,Oracle估算的返回行數和實際行數相差非常大,表明相關表上的統計信息不准確。
我們對DMS_CONTAINERS和DMS_CONTAINER_JN表進行了統計信息收集,統計信息重新收集后Oracle馬上使用了DMS_CONTAINER_JN表上正確的IYC_CNTRID字段的索引,但是DMS_CONTAINERS表上仍舊使用了選擇度不高TYPE字段索引。
進一步查看SQL語句,我們發現該SQL是通過視圖YMS_GUI_LOAD_CONTAINERS_VW訪問DMS_CONTAINERS表,該視圖的定義如下:
由於在視圖where條件中有IYC_TYPE字段,Oracle優先選用IYC_TYPE字段上的索引對DMS_CONTAINERS表進行訪問,在CBO下,Oracle不會再去自動選擇其他字段上單獨的索引進行訪問(除非手工設定AND-EQUAL提示),因此沒有選擇篩選度更高的YC_LSTUPDDT字段上的索引。 如果需要Oracle使用到其他字段上的索引,最簡單的方法就是在IYC_TYPE和YC_LSTUPDDT字段上創建聯合索引,Oracle在分析索引列的時候自動會分析兩個列的組合情況,從而選擇該復合索引。
四總結
通過前面的介紹相信大家對Oracle SQL monitor華麗、直觀的界面留下了深刻的印象,下面我再總結一下使用Oracle SQL monitor進行SQL優化的步驟:
通過SQL monitor監控我們可以快速地發現異常運行的SQL語句,如果您知道SQL對應的SQL ID也可以通過腳本利用SQL monitor查看SQL語句在數據庫中真實的執行計划。
查看SQL執行計划,通過CPU和WAIT的活動比重快速找到SQL執行計划中的關鍵步驟。
通過比較Oracle估算的行數和實際返回行數能夠快速判斷是否需要重新收集統計信息,幫助我們分析Oracle優化器選擇的SQL執行計划有無問題。
具體的SQL優化方法大家可以參考之前丁俊大師在DBA+社群分享過的Oracle SQL優化專題(關注DBA+社群微信公眾號:dbaplus,回復“001”即可查看此文),我在這就不做進一步展開啦。
工欲善其事,必先利其器。小伙伴們,還等什么呢,趕緊去試試Oracle SQL monitor這個被埋沒的SQL優化利器吧!
About Me
....................................................................................................................................................
本文來自於微信公眾號轉載文章,若有侵權,請聯系小麥苗及時刪除
ITPUB BLOG:http://blog.itpub.net/26736162
QQ:642808185 若加QQ請注明您所正在讀的文章標題
【版權所有,文章允許轉載,但須以鏈接方式注明源地址,否則追究法律責任】
....................................................................................................................................................













