可以使用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必须设置为TYPICAL或ALL,CONTROL_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;