SQL Monitor,你值得掌握的一個特性

路途中的人2012發表於2017-05-12
    對於線上的SQL語句,看著執行計劃cost還不錯,但是實際執行的時候效果卻有千壤之別,這是為什麼呢?
    對於一個龐大的SQL語句,看著得到的執行計劃卻不知道瓶頸在哪裡,SQL語句太複雜,但是執行計劃更復雜,要讀明白它掌握要領也不是一件容易的事情。
    碰到很多朋友問我,怎麼去讀一個執行計劃,這個無論說的怎麼細,似乎都不是很容易去理解,語言描述,純文字描述和圖形的效果還是有很大的差別。
    如果你在11g的版本中,SQL Monitor就是一個大大的福利,你值得掌握,如果你還沒有好好掌握它,就實在太可惜了。
至於SQL Monitor更多的細節就不一一描述了,11g推出的這個特性其實和MySQL裡的慢日誌有些類似,MySQL裡面的閾值要更低一些,SQL Monitor是5秒。一旦達到這個標準,就會進收集到v$sql_monitor這個檢視中,可以得到詳細的會話資訊和執行計劃。
    如果想單獨定製,那麼也不是一件難事。可以使用hint monitor來完成。比如這樣的形式
select /*+ monitor */ count(*) from emp where  xxxxx
    如果確認不需要放入監控範圍,也可以使用no_monitor來定製,比如這樣的形式
select /*+ no_monitor */ count(*) from emp where  xxxxx
    檢視生成的監控資訊,可以使用如下的方式:
select dbms_sqltune.report_sql_monitor from dual;
    當然這些都是SQL Monitor常規的一些知識點,這些還不足以讓我興趣大開。我感興趣的是它強大的UI展現能力。當然聽起來這個似乎和這個特性好像關聯不大,你看到效果就知道了。一個很複雜,抽象的事物如果用圖形表示,要比文字豐富形象的多。
    得到SQL Monitor的報告,大體有以下幾種格式。TEXT,HTML,ACTIVE三種
我們打一個比方。很多手機都會按照配置來冠以各種名號。



SQL Monitor的報告也是如此,TEXT格式是標準版,HTML是高配版,ACTIVE是尊享版
我們不來虛的,來實際看看效果。

文字格式的效果如下:


HTML格式的效果如下:
執行概覽,會話資訊,執行計劃一目瞭然,非常貼心。

那麼ACTIVE格式是什麼意思呢,大體就是最炫,最全面的效果,還有一個小的flash效果。


有的朋友可能看到會說,這和HTML的效果有啥差別啊,有的,我再給一張圖。
執行計劃原來可以這麼讀。全表掃描,索引掃描,表連線資訊都一目瞭然,越是複雜的執行計劃這種方式越省事。


SQL文字和繫結變數的資訊,點選SQL_ID就會彈出一個小視窗來。

好吧,看起來這麼炫,想得到這個報告難不難呢,很簡單就一個SQL語句就能搞定,絕對沒有標題黨的意思。
如果想寫成shell指令碼,也就是嵌入一個SQL語句即可。
tmp_sql_id=$1
sqlplus -s  / as sysdba<<eof
set pages 0
set long 99999999
set linesize 300
col comm format a200
set long 99999
SELECT dbms_sqltune.report_sql_monitor(
sql_id => '${tmp_sql_id}',
report_level => 'ALL',
type=>'TEXT',
base_path =>''
) comm
FROM dual;
EOF
唯一的差別就是在type的地方。TEXT,HTML的就設定為TEXT,HTML即可。如果是ACTIVE格式的,這個我們得稍說一些背景。
這個功能在Enterprise Manager中檢視是很自然的一件事情,如果沒有安裝EM,我們不能因為這個專門去部署一個EM來不是。要達到同樣的效果,就需要連線網路下載相應的格式,當然退一步來說,要做以下的一些輔助工作,還可以下載幾個指令碼到本地即可。
比如我們設定一個本地的目錄結構,設定類似的站點 jeanron100
就需要在本地建立一個jeanron100的目錄
mkdir -p jeanron100/sqlmon
然後下載相應的指令碼
wget --mirror --no-host-directories --cut-dirs=1
wget --mirror --no-host-directories --cut-dirs=1
wget --mirror --no-host-directories --cut-dirs=1 http://download.oracle.com/otn_software/emviewers/scripts/document.js
wget --mirror --no-host-directories --cut-dirs=1
生成SQL語句的active報告語句如下:
SELECT dbms_sqltune.report_sql_monitor(
sql_id => '${tmp_sql_id}',
report_level => 'ALL',
type=>'ACTIVE',
base_path =>''
) comm
FROM dual;
把複製到的結果以HTML格式儲存,在本地的目錄下開啟即可。其實感興趣可以讀一下里面的內容,裡面大量使用了xml解析的方式。效果還是蠻不錯的。值得推薦。
</eof

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2139015/,如需轉載,請註明出處,否則將追究法律責任。

相關文章