據說,在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執行計劃有無問題。
<b></b>
<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2015-11-26</b>