11g中引入了新的动态性能视图V$SQL_MONITOR,该视图用以显示Oracle监视的SQL语句信息。SQL监视会对那些并行执行或者消耗5秒以上cpu时间或I/O时间的SQL语句自动启动,同时在V$SQL_MONITOR视图中产生一条记录。当SQL语句正在执行,V$SQL_MONITOR视图中的统计信息将被实时刷新,频率为每秒1次。SQL语句执行完成后,监视信息将不会被立即删除,Oracle会保证相关记录保存一分钟(由参数_sqlmon_recycle_time所控制,默认为60s),最终这些记录都会被删除并被重用。这一新的SQL性能监视特性仅在CONTROL_MANAGEMENT_PACK_ACCESS为DIAGNOSTIC+TUNING和STATISTICS_LEVEL为ALL|TYPICAL时被启用。
SQL> conn maclean/maclean; Connected. SQL> show parameter control_management_pack_access NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_management_pack_access string DIAGNOSTIC+TUNING SQL> show parameter STATISTICS_LEVEL NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ statistics_level string TYPICAL SQL> select * from v$sql_monitor where username='MACLEAN'; no rows selected /*以下语句将消耗大量资源 */ select count(*) from sys.obj$,sys.tab$,sys.col$; ........................ SQL> select key,status,sql_id,cpu_time from v$sql_monitor where username='MACLEAN'; KEY STATUS SQL_ID CPU_TIME ---------- ------------------- ------------- ---------- 9191230013 EXECUTING 1tc94vh92f68b 52915539 SQL> select key,status,sql_id,cpu_time from v$sql_monitor where username='MACLEAN'; KEY STATUS SQL_ID CPU_TIME ---------- ------------------- ------------- ---------- 9191230013 EXECUTING 1tc94vh92f68b 72899267 SQL> select plan_line_id, plan_operation, plan_options starts, output_rows 2 from v$sql_plan_monitor 3 where key = 919123001346; PLAN_LINE_ID PLAN_OPERATION STARTS OUTPUT_ROWS ------------ ------------------------------ ------------------------------ ----------- 0 SELECT STATEMENT 0 1 SORT AGGREGATE 0 2 MERGE JOIN CARTESIAN 4277724845 3 MERGE JOIN CARTESIAN 70256 4 TABLE ACCESS FULL 1 5 BUFFER SORT 70256 6 INDEX FAST FULL SCAN 73378 7 BUFFER SORT 4277724845 8 INDEX FAST FULL SCAN 90611 9 rows selected /* cancel掉之前的查询语句 */ /* 针对那些我们希望特别监视的SQL语句,可以直接使用monitor提示,强制监视 */ SQL> select /*+ monitor */ * from dual where 1=2; no rows selected SQL> select key, status, sql_id, cpu_time 2 from v$sql_monitor 3 where username = 'MACLEAN' 4 and sql_text like '%monitor%'; KEY STATUS SQL_ID CPU_TIME ---------- ------------------- ------------- ---------- 7.2155E+11 DONE (ALL ROWS) 2fr8stwgt15mw 0 /* 可以看到这里原语句的CPU_TIME不到1ms*/ /* 以下为SQL MONITOR的相关的几个隐藏参数 */ SQL> col describ for a80; SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ 2 FROM SYS.x$ksppi x, SYS.x$ksppcv y 3 WHERE x.inst_id = USERENV ('Instance') 4 AND y.inst_id = USERENV ('Instance') 5 AND x.indx = y.indx 6 AND x.ksppinm LIKE '%sqlmon%' 7 order by x.ksppinm; NAME VALUE DESCRIB ------------------------------ ---------- -------------------------------------------------------------------------------- _sqlmon_binds_xml_format default format of column binds_xml in [G]V$SQL_MONITOR _sqlmon_max_plan 80 Maximum number of plans entry that can be monitored. Defaults to 20 per CPU _sqlmon_max_planlines 300 Number of plan lines beyond which a plan cannot be monitored _sqlmon_recycle_time 60 Minimum time (in s) to wait before a plan entry can be recycled _sqlmon_threshold 5 CPU/IO time threshold before a statement is monitored. 0 is disabled
11g中通过以上v$SQL_MONITOR和V$SQL_PLAN_MONITOR视图,我们可以很方便地实时找出系统中可能引起性能问题的SQL语句。此外SQL监视也集成到了DBMS_AUTOTUNE包中,DBMS_SQLTUNE.REPORT_SQL_MONITOR()过程可以帮助我们高效地找出实时系统中的性能问题SQL:
SQL> set long 99999; SQL> set linesiz 300 pagesize 2000; SQL> select dbms_sqltune.report_sql_monitor from dual; REPORT_SQL_MONITOR -------------------------------------------------------------------------------- SQL Monitoring Report SQL Text ------------------------------ select count(*) from sys.obj$,sys.tab$,sys.col$ Global Information ------------------------------ Status : EXECUTING Instance ID : 1 Session : MACLEAN (6:255) SQL ID : cz2bwj0f6ayr0 SQL Execution ID : 16777216 Execution Started : 09/16/2010 14:19:43 First Refresh Time : 09/16/2010 14:19:51 Last Refresh Time : 09/16/2010 14:21:57 Duration : 135s Module/Action : SQL*Plus/- Service : SYS$USERS Program : sqlplus.exe Global Stats ========================================= | Elapsed | Cpu | Other | Buffer | | Time(s) | Time(s) | Waits(s) | Gets | ========================================= | 134 | 132 | 1.82 | 437 | ========================================= SQL Plan Monitoring Details (Plan Hash Value=4003357142) ============================================================================================== ============================================= | Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Mem | Act ivity | Activity Detail | | | | | (Estim) | | Active(s) | Active | | ( Actual) | | (%) | (# samples) | ================================================================================================================== ========================= | 0 | SELECT STATEMENT | | | | | | 1 | | | | | | -> 1 | SORT AGGREGATE | | 1 | | 127 | +8 | 1 | 0 | | 2.24 | Cpu (3) | | -> 2 | MERGE JOIN CARTESIAN | | 808G | 477M | 127 | +8 | 1 | 2G | | | | | -> 3 | MERGE JOIN CARTESIAN | | 14M | 9809 | 127 | +8 | 1 | 27462 | | | | | -> 4 | TABLE ACCESS FULL | TAB$ | 1107 | 201 | 127 | +8 | 1 | 1 | | | | | -> 5 | BUFFER SORT | | 12815 | 9607 | 127 | +8 | 1 | 27462 | 886K | | | | 6 | INDEX FAST FULL SCAN | I_OBJ1 | 12815 | 9 | 1 | +8 | 1 | 73378 | | | | | -> 7 | BUFFER SORT | | 56957 | 477M | 134 | +1 | 27462 | 2G | 1M | 97.76 | Cpu (131) | | 8 | INDEX FAST FULL SCAN | I_COL3 | 56957 | 34 | 1 | +8 | 1 | 90611 | | | | ================================================================================================================== That's cool!
Comment