1. 程式人生 > >使用v$sql_monitor檢視檢視當前正在執行的SQL語句的統計資訊

使用v$sql_monitor檢視檢視當前正在執行的SQL語句的統計資訊

可以使用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;