使用v$sql_monitor视图查看当前正在运行的SQL语句的统计信息

时间:2023-01-02 04:58:01

可以使用v$sql_monitor视图来查看当前运行的SQL的实时统计信息,并且可以查看给定的查询当前所使用的各种资源,例如CPU使用率、获得的缓冲大小、磁盘读取以及查询已经运行的时间等统计信息。

v$sql_monitor视图包含当前正在运行的SQL语句,以及最近运行的SQL语句。

 

使用v$sql_monitor视图中所监控的SQL语句时需在满足以下条件:

1)  自动监控任何并行语句

2)  自动监控任何DML或DDL语句

3)  如果一个SQL语句消耗了超过5秒的CPU或I/O时间,则会自动监控

4)  监控任何在语句级启用监控的SQL语句(使用monitor或no_monitor)

 

 

v$sql_monitor收集的信息每秒刷新一次,接近实时,当SQL执行完毕,信息并不会立即从v$sql_monitor中删除,至少会保留1分钟,v$sql_plan_monitor视图中的执行计划信息也是每秒更新一次,当SQL执行完毕,它们同样至少被保留1分钟,并可以会存在更长的时间,取决于新的查询所需要的空间。

 

提示:结合v$sql_monitor视图与v$sql_plan_monitor视图可以进一步查询SQL的执行计划等信息。联合一些其他视图,如v$active_session_history、v$session、v$session_longops、v$sql、v$sql_plan等,可以获得关于SQL的更多信息。

 

注意:为了进行SQL监控,初始化参数STATISTICS_LEVEL必须设置为TYPICALALLCONTROL_MANAGEMENT_PACK_ACCESS必须设置为DIAGNOSTIC+TUNING

SQL> show parameter STATISTICS_LEVE


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
statistics_level                     string      TYPICAL
SQL> show parameter CONTROL_MANAGEMENT_PACK_ACCESS


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_management_pack_access       string      DIAGNOSTIC+TUNING


如查看数据库中消耗CPU资源排名前10位的查询:


select * from (
select sql_id,username,to_char(sql_exec_start,'yyyy-mm-dd hh24:mi:ss') sql_exec_start,
sql_exec_id,sum(buffer_gets) buffer_gets,
sum(disk_reads) disk_reads,round(sum(cpu_time/1000000),1) cpu_secs
from v$sql_monitor
where username not in ('SYS','SYSTEM')
group by sql_id,username,sql_exec_start,sql_exec_id
order by 7 desc)
where rownum<=10;



SQL_ID        USERNAME                       SQL_EXEC_START      SQL_EXEC_ID BUFFER_GETS DISK_READS   CPU_SECS
------------- ------------------------------ ------------------- ----------- ----------- ---------- ----------
8p8ann3c68vxc SCOTT                          2016-11-24 09:50:20    16777216           0          0       37.1



使用Hint提示监控指定的SQL语句:

select /*+ monitor */e.empno,e.ename,e.sal,d.dname from scott.emp e,scott.dept d wheree.deptno=d.deptno;

 

然后在v$sql_monitor视图中查看被监控的SQL语句消耗的资源信息:

selectsql_id,username,to_char(sql_exec_start,'yyyy-mm-dd hh24:mi:ss') sql_exec_start,

sql_exec_id,sum(buffer_gets) buffer_gets,

sum(disk_reads)disk_reads,round(sum(cpu_time/1000000),1) cpu_secs

from v$sql_monitor

where sql_text like '%monitor%'

group bysql_id,username,sql_exec_start,sql_exec_id;

 

然后可以使用DBMS_SQLTUNE包来查看SQL语句生成的监控信息(如执行计划等):

SQL> set long 10000000

SQL> set longchunksize 10000000

SQL> set linesize 200

SQL> selectdbms_sqltune.report_sql_monitor from dual;