Oracle的一些监控sql

1、ORACLE实时TOP SESSION查询

with tsql as 
(
   select 
       s.sid, s.BLOCKING_SESSION lk_sid,  s.machine,s.osuser,  S.SQL_ID,       Q.CHILD_NUMBER,
       S.EVENT,       Q.EXECUTIONS EXECS, 
       round(Q.ELAPSED_TIME / decode(Q.EXECUTIONS,0,1,Q.EXECUTIONS) / 1000 / 1000,3) ELTM,
       round(Q.BUFFER_GETS / decode(Q.EXECUTIONS,0,1,Q.EXECUTIONS),2) buffget, 
       round(Q.CPU_TIME / decode(Q.EXECUTIONS,0,1,Q.EXECUTIONS),2) CPUTM, 
       round(Q.DISK_READS / decode(Q.EXECUTIONS,0,1,Q.EXECUTIONS),2) DISKRDS, 
       case when s.lockwait is not null then substr(s.p2raw,-8)||substr(s.p3raw,-8) end lk_xid  
       ,Q.LAST_ACTIVE_TIME,Q.SQL_TEXT 
   from v$session s, v$sql q where s.STATUS = 'ACTIVE'
   AND S.SQL_ID = Q.SQL_ID 
   AND S.SQL_CHILD_NUMBER = Q.CHILD_NUMBER
) 
select * from 
( 
       select 'cpu' item,rownum sn,a.* from 
       ( 
       select   
       sid, lk_sid, machine, osuser,    SQL_ID,       CHILD_NUMBER,       EVENT,       EXECS,
       ELTM,       buffget,       CPUTM,       DISKRDS,    lk_xid,   LAST_ACTIVE_TIME,SQL_TEXT  
       from tsql order by CPUTM desc 
       )a 
) where sn <=10     
union all
select * from 
( 
       select 'ram' item,rownum sn,a.* from 
       ( 
       select   
       sid, lk_sid ,  machine, osuser,    SQL_ID,       CHILD_NUMBER,       EVENT,       EXECS,
       ELTM,       buffget,       CPUTM,       DISKRDS,   lk_xid,    LAST_ACTIVE_TIME,SQL_TEXT  
       from tsql order by buffget desc 
      )a 
) where sn <=10     
union all
select * from 
       ( 
       select 'i/o' item,rownum sn,a.* from 
       ( 
       select   
       sid, lk_sid ,  machine, osuser,    SQL_ID,       CHILD_NUMBER,       EVENT,       EXECS,
       ELTM,       buffget,       CPUTM,       DISKRDS,   lk_xid,    LAST_ACTIVE_TIME,SQL_TEXT  
       from tsql order by DISKRDS desc 
      )a 
) where sn <=10   

查询RMAN备份信息

SELECT t.COMMAND_ID as "备份名",t.STATUS as "状态",t.START_TIME as "开始时间",t.TIME_TAKEN_DISPLAY as "所用时间",t.END_TIME as "结束时间"
,t.INPUT_TYPE as "类型",t.OUTPUT_DEVICE_TYPE as "输出设备",t.INPUT_BYTES_DISPLAY as "输入大小"
,t.OUTPUT_BYTES_DISPLAY as "输出大小",t.OUTPUT_BYTES_PER_SEC_DISPLAY as "输出速率(每秒)"
FROM V$RMAN_BACKUP_JOB_DETAILS t where START_TIME>=trunc(sysdate)-7 ORDER BY START_TIME DESC;

近5分钟SQL 活跃度查询

select 
round(100*(count/sum(count) over ()),2) as "PCT", 
sql_id as "SQL ID",
sql_opname as "SQL Type"
from (
  SELECT sql_id, sql_opname, count(*) count
  FROM v$active_session_history
  where sql_id is not null
  and (sysdate - cast(sample_time as date))* 24 * 60 < = 5
  group by sql_id, sql_opname
)
order by 1 desc

TOP 会话


SELECT NVL(a.username, '(oracle)') AS username,
           a.osuser,
           a.sid,
           a.serial#,
           c.value AS &1,
           a.lockwait,
           a.status,
           a.module,
           a.machine,
          a.program,
          TO_CHAR(a.logon_Time,'DD-MON-YYYY HH24:MI:SS') AS logon_time
   FROM   v$session a,
          v$sesstat c,
          v$statname d
   WHERE  a.sid        = c.sid
   AND    c.statistic# = d.statistic#
   AND    d.name       = DECODE(UPPER('&1'), 'READS', 'session logical reads',
                                             'EXECS', 'execute count',
                                             'CPU',   'CPU used by this session',
                                                      'CPU used by this session')
   ORDER BY c.value DESC;

Enter value for 1: EXECS
Enter value for 1: EXECS

USERNAME  OSUSER    SID   SERIAL#  EXECS      LOCKWAIT  STATUS    MODULE                 MACHINE                PROGRAM                LOGON_TIME            
(oracle)  oracle    2     13829    118965523            ACTIVE                           DB01                   oracle@DB01 (RSM0)     07-SEP-2019 13:13:51  
(oracle)  oracle    390   40531    39243652             ACTIVE                           DB01                   oracle@DB01 (MMON)     07-SEP-2019 13:13:35  
(oracle)  oracle    1158  46732    10021323             ACTIVE                           DB01                   oracle@DB01 (CJQ0)     07-SEP-2019 13:13:59  
(oracle)  oracle    1153  26136    2433878              ACTIVE                           DB01                   oracle@DB01 (DMON)     07-SEP-2019 13:13:35  
(oracle)  oracle    1150  1597     71196                ACTIVE                           DB01                   oracle@DB01 (SMON)     07-SEP-2019 13:13:35  
(oracle)  oracle    23    59132    39206                ACTIVE    Streams                DB01                   oracle@DB01 (Q008)     07-SEP-2019 13:14:03  
(oracle)  oracle    769   22070    25888                ACTIVE                           DB01                   oracle@DB01 (RECO)     07-SEP-2019 13:13:35  
(oracle)  oracle    8     36460    20880                ACTIVE                           DB01                   oracle@DB01 (MMNL)     07-SEP-2019 13:13:35  
(oracle)  oracle    764   52351    7429                 ACTIVE                           DB01                   oracle@DB01 (GEN0)     07-SEP-2019 13:13:35  
(oracle)  oracle    766   59233    3294                 ACTIVE                           DB01                   oracle@DB01 (DBRM)     07-SEP-2019 13:13:35  
SAS       mppay     406   33918    1268                 INACTIVE  JDBC Thin Client       sas1                   JDBC Thin Client       22-NOV-2019 14:07:48  
SAS       mppay     403   63413    1074                 INACTIVE  JDBC Thin Client       sas2                   JDBC Thin Client       22-NOV-2019 14:15:45  
(oracle)  oracle    436   56305    676                  ACTIVE    KTSJ                   DB01                   oracle@DB01 (W003)     21-NOV-2019 19:05:32  
SAS       Alvinkam  1177  58517    658                  INACTIVE  PL/SQL Developer       WORKGROUP\SH-PC        plsqldev.exe           22-NOV-2019 11:39:39  

TOP SQL

 SELECT *
    FROM   (SELECT Substr(a.sql_text,1,50) sql_text,
                   Trunc(a.disk_reads/Decode(a.executions,0,1,a.executions)) reads_per_execution, 
                   a.buffer_gets, 
                   a.disk_reads, 
                   a.executions, 
                   a.sorts,
                   a.address,
                   a.SQL_ID
           FROM   v$sqlarea a
           ORDER BY 2 DESC)
           WHERE  rownum <= &1;
 Enter value for 1: 10

SQL_TEXT                                            READS_PER_EXECUTION  BUFFER_GETS  DISK_READS  EXECUTIONS  SORTS  ADDRESS           SQL_ID         
UPDATE RPT_VMPOP_I7_MERCHANT T SET T.TRANS_CHANNEL  17842                724025       17842       1           0      00000002CF0F0FF0  6atw83s0wazta  
UPDATE RPT_VMPOP_I7_FINANCE T SET T.TRANS_CHANNEL   7492                 405441       7492        1           0      000000010B0719D0  0cdsknyntc5wt  
UPDATE ABS_ORDER_BIZ_INF T SET T.CHANNEL_NO = DECO  1130                 5219         1130        1           0      00000000B13A2050  f4jdrmfxujata  
UPDATE CSS_RECON_RESULT_HIS T SET T.PAYCHANNEL_NO   805                  1502         805         1           0      00000001D9552B58  ab4amdjavt2bh  
call dbms_stats.gather_database_stats_job_proc (    551                  377658388    582927      1057        0      000000010ADB9630  b6usrg82hwsa3  
select count(1) from (SELECT         TO_CHAR(a.rec  194                  2994         194         1           0      000000027063B100  fn95gqy87s8s7  
delete /* QOSH:PURGE_OLD_STS *//*+ dynamic_samplin  127                  208970       1023        8           0      0000000071FDB628  1j6tnz8fcm4c3  
call dbms_space.auto_space_advisor_job_proc (  )    45                   2140476989   47874       1057        0      00000000D3A81278  6mcpb06rctk0x  
 select s.synonym_name as object_name, o.object_ty  30                   158701       61          2           1664   00000001D94F82F8  5jvf84zg4c49n  
select * from ( SELECT         to_char(a.work_date  27                   94           27          1           1      00000002CD21D208  fauv3rf864kt6  

重做日志大小评估

SELECT
(
SELECT 
ROUND(AVG(BYTES)/1024/1024,2) FROM V$LOG) AS "當前重做日誌大小(MB)"
,ROUND((20/AVERAGE_PERIOD) * (SELECT AVG(BYTES) FROM V$LOG)/1024/1024,2) AS "推建重做日誌大小(MB)"
FROM 
(
 SELECT AVG((NEXT_TIME - FIRST_TIME) * 24 * 60) AS AVERAGE_PERIOD
 FROM V$ARCHIVED_LOG WHERE FIRST_TIME > trunc(SYSDATE)-3
);

5.IO & 內存消耗排名

#IO

select b.username,a.DISK_READS as reads
,a.EXECUTIONS as exec
,trunc(a.DISK_READS/decode(a.EXECUTIONS,0,1,a.EXECUTIONS),2) as rds_exec_ratio
,a.SQL_TEXT as Statement
from v$sqlarea a,dba_users b where a.PARSING_USER_ID=b.user_id
and a.DISK_READS>100000
order by a.DISK_READS desc;

#內存

select b.username,a.BUFFER_GETS as reads
,a.EXECUTIONS as exec
,trunc(a.BUFFER_GETS/decode(a.EXECUTIONS,0,1,a.EXECUTIONS),2) as rds_exec_ratio
,a.SQL_TEXT as Statement
from v$sqlarea a,dba_users b where a.PARSING_USER_ID=b.user_id
and a.BUFFER_GETS>100000
order by a.DISK_READS desc;

6.通过v$sql查询最占用资源的sql (其中 address 换成sql_text 可以插叙具体sql)

select * from 
 (select sql_id,address, rank() over(order by buffer_gets desc) as rank_bufgets
         ,to_char(100*ratio_to_report(buffer_gets) over(),'999.99') pct_bufgets
  from v$sql
 )
where rank_bufgets<=10;

7.从V$SESSMETRIC 视图中查出当前最占用资源的会话

s

elect to_char(m.END_TIME,'yyyy-mm-dd hh24:mi:ss') as e_dttm,  -- Interval End Time
m.INTSIZE_CSEC/100 ints,   -- Interval size in sec
s.USERNAME as usr,
m.SESSION_ID sid,
m.SESSION_SERIAL_NUM as ssn,
round(m.cpu) as cpu100,     --cpu usage 100th sec
m.PHYSICAL_READS as prds,    --Number of physical reads
m.LOGICAL_READS as lrds,    --Number of logical reads
m.PGA_MEMORY as pga,         --pga size at end of interval
m.HARD_PARSES as hp,
m.SOFT_PARSES as sp,
m.PHYSICAL_READ_PCT as prp,
m."LOGICAL_READ_PCT" as lrp,
s.SQL_ID
from v$sessmetric m,v$session s
where (m.PHYSICAL_READS > 10 or m.CPU > 10 or m.LOGICAL_READS >10)
and m.SESSION_ID=s.SID and m.SESSION_SERIAL_NUM = s.SERIAL#
order by m.PHYSICAL_READS desc,m.CPU desc,m.LOGICAL_READS desc;

8.查看可用的AWR快照

select snap_id
,to_char(t.begin_interval_time,'yyyy-mm-dd hh24:mi:ss') as b_dttm
,to_char(t.end_interval_time,'yyyy-mm-dd hh24:mi:ss')  as e_dttm
from dba_hist_snapshot t where t.begin_interval_time>trunc(sysdate);
9.從 dba_hist_sqlstat視圖中發現最糟糕的SQL

select t.snap_id,t.sql_id,t.disk_reads_delta as reads_delta
,t.executions_delta as exec_delta
,trunc(t.disk_reads_delta / decode(t.executions_delta,0,1,t.executions_delta),2) as rds_exec_ratio
from dba_hist_sqlstat t
where t.disk_reads_delta >100000
order by t.disk_reads_delta;

#通过sql_id 查询sql文本

select command_type,sql_text
from dba_hist_sqltext t where t.sql_id='30cp09r373xng';

#通过sql_id查询执行计划

select * from table(dbms_xplan.display_awr('30cp09r373xng'));

or

select * from table(dbms_xplan.display_cursor('2tug3qkvp32uc',null,'advanced'));
10.DBA_HIST_SQLSTAT (比如查看某条sql语句的性能历史)

select ss.instance_number node,
to_char(begin_interval_time,'yyyy-mm-dd hh24:mi:ss') as "开始时间",
to_char(END_INTERVAL_TIME,'yyyy-mm-dd hh24:mi:ss') as "结束时间",
sql_id,
plan_hash_value,
nvl(executions_delta, 0) as "执行次数",
trunc(elapsed_time_delta / 1000000) as "执行时间(秒)",
trunc((elapsed_time_delta / decode(nvl(executions_delta, 0), 0, 1, executions_delta)) / 1000) as "平均执行时间(毫秒)",
buffer_gets_delta as "逻辑读",
trunc((buffer_gets_delta /  decode(nvl(buffer_gets_delta, 0), 0, 1, executions_delta))) as "平均逻辑读"
from DBA_HIST_SQLSTAT S, DBA_HIST_SNAPSHOT SS
where sql_id = '9xu89rhmakhv8'--问题sql语句的sql_id值
and ss.snap_id = S.snap_id
and ss.instance_number = S.instance_number
and s.instance_number=1
and executions_delta > 0
order by NODE,BEGIN_INTERVAL_TIME

11.最近7天,指定时间段(8:00-16:00)最消耗CPU的10条语句

select a.*,b.sql_text
from
(
  select * from 
  (  
      select 
      s.SQL_ID, 
      trunc(sum(s.CPU_TIME_DELTA)/1000000) as CPU_TIME_DELTA_SUM, 
      sum(nvl(executions_delta, 0)) as "执行次数",
      sum(s.DISK_READS_DELTA) as DISK_READS_DELTA_SUM, 
      count(*) as icount
      from DBA_HIST_SQLSTAT s, DBA_HIST_SNAPSHOT p 
      where 1=1 
      and s.SNAP_ID = p.SNAP_ID 
      and EXTRACT(HOUR FROM p.END_INTERVAL_TIME) between 8 and 16 
      and p.END_INTERVAL_TIME between SYSDATE-7 and SYSDATE 
      group by s.SQL_ID 
      order by sum(s.CPU_TIME_DELTA) desc 
  )  
  where rownum < 11 
) a left join DBA_HIST_SQLTEXT b 
on(a.SQL_ID = b.sql_id and b.COMMAND_TYPE != 47) -- != 47 Exclude PL/SQL blocks from output 
order by 2 desc

链接:https://www.jianshu.com/p/0522ea59efe1
来源:简书

你可能感兴趣的:(数据库,oracle,sql)