Oracle 11g實時SQL監控:
前面提到,在Oracle Database 11g中,v$session視圖增加了一些新的字段,這其中包括SQL_EXEC_START和SQL_EXEC_ID,這兩個字段實際上代表了Oracle 11g的一個新特性:實時的SQL監控(Real Time SQL Monitoring)。
在Oracle 11g之前的版本,長時間運行的SQL可以通過監控v$session_longops來觀察,當某個操作執行時間超過6秒,就會被記錄在v$session_longops中,通常可以監控到全表掃描、全索引掃描、哈希聯接、並行查詢等操作;而在Oracle 11g中,當SQL並行執行時,會立即被實時監控到,或者當SQL單進程運行時,如果消耗超過5秒的CPU或I/O時間,它也會被監控到。監控數據被記錄在v$sql_monitor視圖中,當然也可以通過Oracle 11g新增的package DBMS_MONITOR來主動對SQL執行監控部署。
來看一下主要視圖v$sql_monitor的結構:
sys@CCDB> desc v$sql_monitor
Name Null? Type
------------------------ -------- ------------------
KEY NUMBER
STATUS VARCHAR2(19)
FIRST_REFRESH_TIME DATE
LAST_REFRESH_TIME DATE
REFRESH_COUNT NUMBER
SID NUMBER
PROCESS_NAME VARCHAR2(5)
SQL_ID VARCHAR2(13)
SQL_EXEC_START DATE
SQL_EXEC_ID NUMBER
SQL_PLAN_HASH_VALUE NUMBER
SQL_CHILD_ADDRESS RAW(8)
SESSION_SERIAL# NUMBER
PX_SERVER# NUMBER
PX_SERVER_GROUP NUMBER
PX_SERVER_SET NUMBER
PX_QCINST_ID NUMBER
PX_QCSID NUMBER
ELAPSED_TIME NUMBER
CPU_TIME NUMBER
FETCHES NUMBER
BUFFER_GETS NUMBER
DISK_READS NUMBER
DIRECT_WRITES NUMBER
APPLICATION_WAIT_TIME NUMBER
CONCURRENCY_WAIT_TIME NUMBER
CLUSTER_WAIT_TIME NUMBER
USER_IO_WAIT_TIME NUMBER
PLSQL_EXEC_TIME NUMBER
JAVA_EXEC_TIME NUMBER
注意這裏的SQL_EXEC_ID就是v$session視圖中新增字段的來源。這個視圖還記錄了SQL的CPU_TIME以及BUFFER_GETS等重要信息,對於診斷SQL性能問題具有極大的幫助。結合v$sql_monitor視圖與v$sql_plan_monitor視圖可以進一步查詢SQL的執行計劃等信息。聯合一些其他視圖,如v$active_session_history、v$session、v$session_longops、v$sql、v$sql_plan等,可以獲得關於SQL的更多信息。
v$sql_monitor收集的信息每秒刷新一次,接近實時,當SQL執行完畢,信息並不會立即從v$sql_monitor中刪除,至少會保留1分鐘,v$sql_plan_monitor視圖中的執行計劃信息也是每秒更新一次,當SQL執行完畢,它們同樣至少被保留1分鐘。
實時SQL監控需要statistics_level初始化參數設置爲TYPICAL或ALL:
sys@CCDB> show parameter statistics_level
NAME TYPE VALUE
--------------------- ------------ -------------
statistics_level string TYPICAL
sys@CCDB> select statistics_name,session_status,system_status,activation_level,session_settable
2 from v$statistics_level
3 where statistics_name = 'SQL Monitoring';
STATISTICS_NAME SESSION_STATUS SYSTEM_STATUS ACTIVATION_LEVEL SESSION_S
----------------- ---------------- ---------------- ------------------ ---------
SQL Monitoring ENABLED ENABLED TYPICAL YES
同時CONTROL_MANAGEMENT_PACK_ACCESS參數必須是DIAGNOSTIC+TUNING(這是缺省設置):
sys@CCDB> show parameter control_manage
NAME TYPE VALUE
------------------------------------ ------------ ----------------------
control_management_pack_access string DIAGNOSTIC+TUNING
在如上設置下,數據庫會啓動自動的實時SQL監控,Oracle還提供Hints可以強制制定對SQL執行監控或者不允許監控,這兩個Hints是monitor與no_monitor。
強制對某個SQL使用實時監控可以如下改寫SQL:
select /*+ monitor */ count(*) from emp where sal > 5000;
指定不執行實時監控:
select /*+ no_monitor */ count(*) from emp where sal > 5000;
查看數據庫中已經生成的監控信息可以使用DBMS_SQLTUNE包來實現:
sys@CCDB> set long 10000000
sys@CCDB> set longchunksize 10000000
sys@CCDB> set linesize 200
sys@CCDB> select dbms_sqltune.report_sql_monitor from dual;
REPORT_SQL_MONITOR
-----------------------------------
SQL Monitoring ReportSQL Text
--------------------------------------------------------------
--------------------------------------------------------------Global Information
Status : DONE (ALL ROWS)
Instance ID : 1
Session ID : 982
SQL ID : gn3h2qrqdfwru
SQL Execution ID : 16777216
Plan Hash Value : 2959114426
Execution Started : 02/28/2010 14:02:37
First Refresh Time : 02/28/2010 14:02:41
Last Refresh Time : 02/28/2010 14:02:42--------------------------------------------------------------------
| Elapsed | Cpu | IO | Other | Fetch | Buffer | Reads |
| Time(s) | Time(s) | Waits(s) | Waits(s) | Calls | Gets | |
--------------------------------------------------------------------
| 3.46 | 0.13 | 2.38 | 0.94 | 1 | 1752 | 1214 |
--------------------------------------------------------------------SQL Plan Monitoring Details
============================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Starts | Rows | Activity | Activity Detail |
| | | | (Estim) | | Active(s) | Active | | (Actual) | (percent) | (sample #) |
============================================================================================================================================
| 0 | SELECT STATEMENT | | | | 1 | +5 | 1 | 1 | | |
| 1 | SORT AGGREGATE | | | | 1 | +5 | 1 | 1 | | |
| 2 | APPROXIMATE NDV AGGREGATE | | | | 2 | +4 | 1 | 58610 | | |REPORT_SQL_MONITOR
--------------------------------------------------------------------------------------------------------------------------------------------------
| 3 | TABLE ACCESS FULL | | | | 5 | +1 | 1 | 86645 | 100.00 | Cpu (1) |
| | | | | | | | | | | db file scattered read (3) |
=======================================================================================================================
我在自己的RAC測試機測了下 果真不錯 只是設置SET LINESIZE 1000 然後把字體調小到9號 SSH CLIENT 就很好顯示執行計劃了
SQL Monitoring Report
SQL Text
------------------------------
SELECT SUM(C) FROM ( SELECT COUNT(*)C FROM CCPS_TRADERECORD T,CCPS_CREDITINFO C WHERE 1=1 AND t.tr_no=C.CI_TR_NO AND T.TR_STATUS=1 AND CI_SHA256=:1 UNION SELECT COUNT(*) C FROM CCPS_OLDWHITELIST OW WHERE OW.OW_CARDINFO=:2 )
Global Information
------------------------------
Status : DONE (ALL ROWS)
Instance ID : 2
Session : ASIACASH (47:12925)
SQL ID : 52ukfnr2ns742
SQL Execution ID : 33554456
Execution Started : 04/09/2014 12:29:33
First Refresh Time : 04/09/2014 12:29:37
Last Refresh Time : 04/09/2014 12:30:16
Duration : 43s
Module/Action : JDBC Thin Client/-
Service : lotest
Program : JDBC Thin Client
Fetch Calls : 1
Binds
========================================================================================================================
| Name | Position | Type | Value |
========================================================================================================================
| :1 | 1 | VARCHAR2(4000) | 12a37ad2972ba2ad58fa834ce69aeb489e3e6824a3fcbba078146b2cfe619bc0b41627f0a4e6cbcc6 |
| | | | cbf401610e4c3ee1b21b3a695ec1146749027aa2fc96774796788528826034928717be5efd3da6e |
| :2 | 2 | VARCHAR2(4000) | d22c0b383ff28ab45e15694f4b949b2a598ec8a18400c3dab33f1f2e02be0ed0 |
========================================================================================================================
Global Stats
============================================================================
| Elapsed | Cpu | IO | Cluster | Fetch | Buffer | Read | Read |
| Time(s) | Time(s) | Waits(s) | Waits(s) | Calls | Gets | Reqs | Bytes |
============================================================================
| 45 | 8.06 | 27 | 11 | 1 | 64447 | 43843 | 353MB |
============================================================================
SQL Plan Monitoring Details (Plan Hash Value=3401659647)
==========================================================================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Read | Read | Mem | Activity | Activity Detail |
| | | | (Estim) | | Active(s) | Active | | (Actual) | Reqs | Bytes | (Max) | (%) | (# samples) |
==========================================================================================================================================================================================
| 0 | SELECT STATEMENT | | | | 1 | +43 | 1 | 1 | | | | | |
| 1 | SORT AGGREGATE | | 1 | | 1 | +43 | 1 | 1 | | | | | |
| 2 | VIEW | | 2 | 6764 | 1 | +43 | 1 | 2 | | | | | |
| 3 | SORT UNIQUE | | 2 | 6764 | 1 | +43 | 1 | 2 | | | 2048 | | |
| 4 | UNION-ALL | | | | 1 | +43 | 1 | 2 | | | | | |
| 5 | SORT AGGREGATE | | 1 | 6761 | 2 | +42 | 1 | 1 | | | | | |
| 6 | HASH JOIN | | 3470 | 6457 | 40 | +4 | 1 | 200K | | | 21M | 2.38 | Cpu (1) |
| 7 | TABLE ACCESS BY INDEX ROWID | CCPS_CREDITINFO | 3469 | 866 | 41 | +2 | 1 | 203K | 32298 | 252MB | | 76.19 | gc cr grant 2-way (10) |
| | | | | | | | | | | | | | Cpu (8) |
| | | | | | | | | | | | | | db file sequential read (14) |
| 8 | INDEX RANGE SCAN | IX_CI_SHA256 | 3417 | 166 | 42 | +1 | 1 | 203K | 9193 | 72MB | | 21.43 | gc cr grant 2-way (3) |
| | | | | | | | | | | | | | Cpu (2) |
| | | | | | | | | | | | | | db file sequential read (4) |
| 9 | TABLE ACCESS FULL | CCPS_TRADERECORD | 201K | 5590 | 2 | +42 | 1 | 201K | 124 | 11MB | | | |
| 10 | SORT AGGREGATE | | 1 | 3 | 1 | +43 | 1 | 1 | | | | | |
| 11 | INDEX UNIQUE SCAN | OW_CARDINFO | 1 | 2 | | | 1 | | 3 | 24576 | | | |
==========================================================================================================================================================================================