SQL调优和性能监控利器SQL Monitor
SQL Monitor是Oracle官方提供的自動監控符合特定條件的SQL,用于收集執行時的細節信息的監控工具,常用于SQL調優和系統性能監控。
Oracle 11g中,當SQL滿足以下條件之一就會被SQL Monitor捕獲到,監控數據被記錄在v$sql_monitor視圖中,
(1) 當SQL并行執行時,會立即被實時監控到。
(2) 當SQL單進程運行時,如果消耗超過5秒的CPU或I/O時間,會監控到。
(3) 使用/*+ monitor */提示的SQL語句。
另外一個前提,就是以下兩個參數的設置,
(1) statistics_level級別必須是TYPICAL或者ALL。
(2) control_management_pack_access設置為'DIAGNOSTIC+TUNING'。
SQL Monitor在Oracle企業版數據庫中是免費使用的,打開SQL Monitor Report有兩種形式,一個就是通過Oracle EM,中文名稱是“SQL監控”,
另外一種獲得SQL Monitor Report的形式就是通過dbms_sqltune包,這可能是我們經常用到的,一個原因是我們未必能使用圖形界面,尤其是生產環境,端口都是禁用的,另外一個原因,就是我們能在監控腳本中調用dbms_sqltune,便于編寫我們的監控邏輯。
我們嘗試通過dbms_sqltune看下這個SQL Monitor Report。
(1) 確認參數
SQL> show parameter statistics_level NAME?????????????????????????????????TYPE????????VALUE ------------------------------------ ----------- ------------------------------ statistics_level?????????????????????string??????TYPICALSQL>?show?parameter?control_management_pack_access; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_management_pack_access string DIAGNOSTIC+TUNING(2) 確定要監控的SQL ID
其實就是確定什么樣的SQL會記錄到v$sql_monitor視圖中,這里我們采用hint,讓SQL進入v$sql_monitor,
SQL> select /*+ monitor */ type, count(*) from v$lock group by type; TY???COUNT(*) -- ---------- CF 1 KT 3 RD 1 KD 1 XR 1 RT 1 AE 7 TS 2 RS 1 TO 3 MR?????????14可從v$sql或者v$sql_monitor找到這條SQL的ID,
(3)?dbms_sqltune
通過設置set,格式化輸出,還可以選擇spool,將輸出打印到本地文件中,其中dbms_sqltune.report_sql_monitor可以指定報告的格式,包括'TEXT'、'HTML'、'XML' 、'ACTIVE'(只在11g R2以后才支持),
SQL> set long 1000000 SQL> set longchunksize 100000 SQL> set linesize 1000 SQL> set pagesize 0 SQL> set trim on SQL> set trimspool on SQL> set echo off SQL> set feedback off SQL> spool report_sql_monitor.txt SQL> select dbms_sqltune.report_sql_monitor(sql_id=>'02qa4khbuqv92', type=>'TEXT', report_level=>'ALL') as report from dual; SQL Monitoring ReportSQL Text ------------------------------ select /*+ monitor */ type, count(*) from v$lock group by typeGlobal Information ------------------------------Status : DONE (ALL ROWS)Instance ID : 1Session : SYS (1:38345)SQL ID : 02qa4khbuqv92SQL Execution ID : 16777216Execution?Started???:??02/05/2022?15:20:01First?Refresh?Time??:??02/05/2022?15:20:01Last?Refresh?Time???:??02/05/2022?15:20:01Duration : .027419sModule/Action : sqlplus@centos (TNS V1-V3)/-Service : SYS$USERSProgram : sqlplus@centos (TNS V1-V3)Fetch?Calls?????????:??2Global Stats ======================================== | Elapsed | Cpu | Other | Fetch | | Time(s) | Time(s) | Waits(s) | Calls | ======================================== | 0.03 | 0.01 | 0.02 | 2 | ========================================SQL?Plan?Monitoring?Details?(Plan?Hash?Value=3191625931) ============================================================================================================================================== | Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Mem | Activity | Activity Detail | | | | | (Estim) | | Active(s) | Active | | (Actual) | (Max) | (%) | (# samples) | ============================================================================================================================================== | 0 | SELECT STATEMENT | | | | 1 | +0 | 1 | 11 | . | | | | 1 | HASH GROUP BY | | 29 | 2 | 1 | +0 | 1 | 11 | 1MB | | | | 2 | HASH JOIN | | 5576 | 1 | 1 | +0 | 1 | 35 | 1MB | | | | 3 | HASH JOIN | | 242 | 1 | 1 | +0 | 1 | 35 | 2MB | | | | 4 | VIEW | GV$_LOCK | 242 | 1 | 1 | +0 | 1 | 37 | . | | | | 5 | UNION-ALL | | | | 1 | +0 | 1 | 37 | . | | | | 6 | FILTER | | | | 1 | +0 | 1 | 37 | . | | | | 7 | VIEW | GV$_LOCK1 | 234 | 1 | 1 | +0 | 1 | 37 | . | | | | 8 | UNION-ALL | | | | 1 | +0 | 1 | 37 | . | | | | 9 | FIXED TABLE FULL | X$KDNSSF | 1 | | | | 1 | | . | | | | 10 | FIXED TABLE FULL | X$KSQEQ | 233 | 1 | 1 | +0 | 1 | 37 | . | | | | 11 | FIXED TABLE FULL | X$KTADM | 1 | | | | 1 | | . | | | | 12 | FIXED TABLE FULL | X$KTATRFIL | 1 | | | | 1 | | . | | | | 13 | FIXED TABLE FULL | X$KTATRFSL | 1 | | | | 1 | | . | | | | 14 | FIXED TABLE FULL | X$KTATL | 1 | | | | 1 | | . | | | | 15 | FIXED TABLE FULL | X$KTSTUSC | 1 | | | | 1 | | . | | | | 16 | FIXED TABLE FULL | X$KTSTUSS | 1 | | | | 1 | | . | | | | 17 | FIXED TABLE FULL | X$KTSTUSG | 1 | | | | 1 | | . | | | | 18 | FIXED TABLE FULL | X$KTCXB | 1 | | | | 1 | | . | | | | 19 | FIXED TABLE FULL | X$KSUSE | 472 | | 1 | +0 | 1 | 472 | . | | | | 20 | FIXED TABLE FULL | X$KSQRS | 2304 | | 1 | +0 | 1 | 2304 | . | | | ==============================================================================================================================================SQL> spool off如果選擇HTML格式的,
select dbms_sqltune.report_sql_monitor(sql_id=>'02qa4khbuqv92', type=>'HTML', report_level=>'ALL') as report from dual;就得到了HTML的SQL Monitor Report,
結合SQL Monitor Report,我們就可以關注其中存在的一些問題,例如通常會根據最右邊CPU和wait的activity,找到SQL執行計劃中資源消耗較高的步驟。然后看下Oracle估算的返回行數和實際的返回行數是否相差很大,如果估算的行數和實際的行數相差不大,至少表明目前對應數據庫對象上的統計信息是準確的,否則就可能存在統計信息不準的問題。還可以關注SQL的篩選條件,判斷是否使用了正確的索引等優化手段。
可以說SQL Monitor是個有效采集信息便于診斷SQL性能問題的一個“可視化”工具,但具體的問題和原因,還是要具體分析,看到的,未必是真實的,就像破案一樣,這可能才是調優的樂趣所在。
近期更新的文章:
《spool導出格式的問題》
《最近碰到的一些問題》
《關于數據治理的讀書筆記 - 什么是數據治理?》
《關于數據治理的讀書筆記 - 數據治理、數據管理和數據管控的理解》
《通過Java得到語句的執行計劃》
文章分類和索引:
《公眾號900篇文章分類和索引》
總結
以上是生活随笔為你收集整理的SQL调优和性能监控利器SQL Monitor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算、分布式计算、并行计算、网格计算、
- 下一篇: ipv6服务器安装mysql_ipv6安