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时被启用。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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
------------ ------------------------------ ------------------------------ -----------
            SELECT  STATEMENT                                                        0
            1 SORT                           AGGREGATE                                0
            2 MERGE  JOIN                      CARTESIAN                       4277724845
            3 MERGE  JOIN                      CARTESIAN                            70256
            TABLE  ACCESS                    FULL                                      1
            5 BUFFER                         SORT                                 70256
            INDEX                           FAST  FULL  SCAN                       73378
            7 BUFFER                         SORT                            4277724845
            INDEX                           FAST  FULL  SCAN                       90611
 
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:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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!