Daily sql collection -Updated on Mar 27th,2013

// Undo 空间管理

select status,sum(bytes/1024/1024) from dba_undo_extents/* where tablespace_name='UNDOTBS1'*/ group by status;  --active,expired,
select tablespace_name,sum(bytes/1024/1024) from dba_free_space where tablespace_name='UNDOTBS1' group by tablespace_name;
select bytes/1024/1024 from dba_data_files where tablespace_name like '%UNDO%';

//session 使用的undo

select b.sid ,value  "undo change vector size"  
    from v$statname a, v$sesstat b  
    where a.statistic# = b.statistic#  
    and a.name ='undo change vector size' ;-- 'redo size';


//具体undo block有4种状态
//1.active表示使用这个undo block的 transaction还未提交
//2.inactive:undo block上没有活动事务,可以被覆盖(但是未过期expired)
//3.expired:undo block状态为inactive的时间 超过了undo_retention
//4.free:空的


ADDM instance 级别问题;AWR+SQL ADVISOR+SQL ACCESS ADVISOR +10046+ sql_trace 查APP问题;ASH活动会话级别问题。

ADDMRPT.SQL,AWRRPT.SQL,ASHRPT.SQ( ashrpti.sql Rac instance)

//bdump


alter session set events 'immediate trace name systemstate level 10';

alter session set events 'immediate trace name HANGANALYZE level 3';


//激活10046事件诊断sql问题                                                             

//通过设置10046事件来进行SQL跟踪,并且可以设置不同的跟踪级别,比使用SQL_TRACE获得更多的信息。

Level 0   停用SQL跟踪,相当于SQL_TRACE=FALSE
Level 1   标准SQL跟踪,相当于SQL_TRACE=TRUE
Level 4   在level 1的基础上增加绑定变量的信息
Level 8   在level 1的基础上增加等待事件的信息
Level 12  在level 1的基础上增加绑定变量和等待事件的信息

 
10046事件不但可以跟踪用户会话(trace文件位于USER_DUMP_DEST ),也可以跟踪background进程(trace文件位于BACKGROUND_DUMP_DEST )。
trace文件的大小决定于4个因素:跟踪级别,跟踪时长,会话的活动级别和MAX_DUMP_FILE_SIZE参数。


//启用跟踪事件10046


0.在全局设置/修改初始化参数

EVENT = "10046 trace name context forever, level 8"

1.在当前session设置

alter session set tracefile_identifier = 'MyTrace'; 或

select tracefile,p.spid
  from v$process p, v$session s
 where s.paddr = p.addr
   and s.sid = (select sid from v$mystat where rownum = 1);

alter session set events '10046 trace name context forever, level 8';
alter session set events '10046 trace name context off';

 
2.对其他用户session设置

--首先通过V$PROCESS获得该session的os process id。

select s.username, p.spid os_process_id, p.pid Oracle_process_id
from v$session s, v$process p
where  s.paddr = p.addr and  s.username = upper('TRACE_USERNAME');


oradebug setospid 4336;
oradebug unlimit;
oradebug event 10046 trace name context forever, level 8;
oradebug event 10046 trace name context off;

SQL> oradebug setmypid

Statement processed.

SQL> oradebug tracefile_name

/opt/oracle/product/9.2.0/rdbms/log/uxdb_ora_9183.trc  --获取跟踪文件

--首先获得要跟踪的session的session id和serial number

select sid,serial#,username from v$session where username='TRACE_USERNAME';
alter session set tracefile_identifier = 'MyTrace';

exec dbms_support.start_trace_in_session(sid => 13,serial# => 15,waits => true,binds => true);
exec dbms_support.stop_trace_in_session(sid => 1234,serial# => 56789);

或者

exec dbms_system.set_ev( 13, 15, 10046, 8, '');
exec dbms_system.set_ev( 13, 15, 10046, 0, '');

或者

exec dbms_monitor.session_trace_enable(session_id => 13,serial_num => 15,waits => true,binds => true);
exec dbms_monitor.session_trace_disable(session_id => 13,serial_num => 15);

3.查看当前session的跟踪级别

SQL>Set serveroutput on
SQL> declare
     event_level number;
     begin
     dbms_system.read_ev(10046,event_level);
     dbms_output.put_line(to_char(event_level));
     end;
     /                                                               

 --1.实例用于工作和等待的时间比率(最近1,2分钟或半分钟):
select begin_time,
       end_time,
       round((end_time - begin_time) * 60 * 60 * 24, 2) || 's' as Duration,
       metric_name,
       round(value, 3) value,
       metric_unit
  from v$sysmetric
 where metric_name in ('Database CPU Time Ratio',
                       'Database Wait Time Ratio',
                       'Disk Sort Per Sec',
                       'Memory Sorts Ratio',
                       'Buffer Cache Hit Ratio',
                       'Physical Reads Per Sec',
                       'Redo Generated Per Sec',
                       'Library Cache Hit Ratio',
                       'Row Cache Hit Ratio',
                       'Soft Parse Ratio')
   and INTSIZE_CSEC = (select max(intsize_csec) from v$sysmetric)
 order by metric_id desc;

--1.1 有等待的活动会话or当前有等待的session
--1) v$session as datasource
SELECT inst_id, event,state,sid,machine,program,username,p1text,p1,p2text,p2,p3text,p3,blocking_session,seconds_in_wait,wait_time
  FROM gv$session
 WHERE state IN ('WAITING')
   AND wait_class != 'Idle'
   and event not like 'PX%';

--Parameter meaning
select t.name,t.event_id,t.wait_class,t.parameter1, t.parameter2,t.parameter3  from v$event_name t where t.name='&event_name';

--2)v$session_wait as datasource
select wait_class,event, sid, state, wait_time, seconds_in_wait,t.p1text,t.p1, t.p2text, t.p2, t.p3text,t.p3
  from v$session_wait t
 where wait_class <> 'Idle'
 order by wait_class, event, sid;

--1.1.1 锁等待信息(以上查询结果是一个树状结构,如果有子节点,则表示有等待发生)  

SELECT /*+ rule */
 (SELECT '''' || TT.SID || ',' || SS.SERIAL# || ''' (' || SS.MACHINE || ')'
    FROM V$LOCK TT, V$SESSION SS
   WHERE TT.BLOCK = 1
     AND TT.SID = SS.SID
     AND TT.ID1 = (SELECT T.ID1 FROM V$LOCK T WHERE S.LOCKWAIT = T.KADDR)) AS BLOCKED_BY_SID_SERIAL#,
 decode(l.LOCKED_MODE,
        0,
        'None',
        1,
        'Null',
        2,
        'Row-S',
        3,
        'Row-X',
        4,
        'Share',
        5,
        'S/Row-X',
        6,
        'Exclusive',
        'Unknown') LockMode,
 LPAD(' ', DECODE(L.XIDUSN, 0, 3, 0)) || L.ORACLE_USERNAME USER_NAME,
 O.OWNER,
 O.OBJECT_NAME,
 S.MODULE,
 S.MACHINE,
 O.OBJECT_TYPE,
 S.SID,
 S.SERIAL#
  FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S
 WHERE L.OBJECT_ID = O.OBJECT_ID
   AND L.SESSION_ID = S.SID
 ORDER BY O.OBJECT_ID, XIDUSN DESC;

--1.1.2 当前锁(XIDUSN,XIDSLOT,XIDSQN是活得锁后的事务槽信息)

SELECT a.inst_id,
       a.oracle_username,
       c.sid,
       c.machine,
       c.osuser,
       decode(a.locked_mode,
              0,
              'None',
              1,
              'Null',
              2,
              'Row share',
              3,
              'Row Exclusive',
              4,
              'Share',
              5,
              'Share Row Exclusive',
              6,
              'Exclusive') lock_type,
       b.owner,
       b.object_name,
       a.xidusn,
       a.xidslot,
       a.xidsqn
  FROM gv$locked_object a, all_objects b, gv$session c
 WHERE a.object_id = b.object_id
   AND a.inst_id = c.inst_id
   and a.session_id = c.sid;

--1.2 15min内最重要的等待事件

select a.event, sum(a.wait_time + a.time_waited) total_wait_time
  from v$active_session_history a
 where a.sample_time between sysdate - 30 / 2880 and sysdate
 group by a.event
 order by total_wait_time desc;

--1.2.1 15min 内等待最多的用户

  select s.sid,
         s.username,
         sum(a.wait_time + a.time_waited) total_wait_time
    from v$active_session_history a, v$session s
   where a.sample_time between sysdate - 15/60*24 and sysdate
     and a.session_id = s.sid
   group by s.sid, s.username
   order by total_wait_time desc;

--1.2.2 实例中等待最多的sql

  select a.user_id,
         d.username,
         s.sql_text,
         sum(a.wait_time + a.time_waited) total_wait_time
    from v$active_session_history a, v$sqlarea s, dba_users d
   where a.sample_time between sysdate - 15/60*24 and sysdate
     and a.sql_id = s.sql_id
     and a.user_id = d.user_id
   group by a.user_id, d.username, s.sql_text
   order by total_wait_time desc;

--1.3 最多的等待对象及这些对象在近15分钟内等待事件类型

select o.object_name,
       o.object_type,
       a.event,
       sum(a.wait_time + a.time_waited) total_wait_time
  from v$active_session_history a, dba_objects o
 where a.sample_time between sysdate -15/60*24 and sysdate
   and a.current_obj# = o.object_id
 group by o.object_name, o.object_type, a.event
 order by total_wait_time;

--2.1实例总等待按等待类的分布百分比(等待次数+等待时间(百分之一秒))

select wait_class,
       total_waits,
       --sum_waits,
       round(100 * (total_waits / sum_waits), 2) pct_tot_waits,
       round((time_waited / 100), 2) time_waited_sec,
       --round((sum_time / 100), 2) as sum_time_sec,
       round(100 * (time_waited / sum_time), 2) pct_time
  from (select wait_class, total_waits, time_waited
          from v$system_wait_class
         where wait_class != 'Idle'),
       (select sum(total_waits) sum_waits, sum(time_waited) sum_time
          from v$system_wait_class
         where wait_class != 'Idle')
 order by pct_time desc;

--2.2 各等待事件排行榜
select event,
       total_waits,
       round(time_waited / 100, 2) as time_wait_sec,
       round(average_wait / 100, 2) average_wait_sec
  from v$system_event
 where event not in ('pmon timer',
                     'smon timer',
                     'rdbms ipc reply',
                     'rdbms ipc message',
                     'parallel deque wait',
                     'virtual circuit',
                     '%SQL*Net%',
                     'client message',
                     'NULL event',
                     '%idle%')
 order by time_waited desc;

-- 正在运行的大session执行百分比和预计完成时间
col sid format 999999 col opname format a30 col target format a20 col pct format a10 set lines 500

    select sid,
         serial#, SOFAR, TOTALWORK,
         round((sofar / totalwork) * 100, 2) || '%' pct,
         opname,
         target,
         round(time_remaining / 60, 2) minutes
    from v$session_longops
   where round((sofar / totalwork) * 100, 2) != '100'
     and totalwork <> sofar
      AND TOTALWORK != 0;

 

--当前所有用户级会话列表(除去系统级)

select inst_id,
       saddr,
       paddr,
       sid,
       username,
       status,
       server,
       machine,
       program,
       logon_time,
       event,
       p1,
       p2
  from gv$session
 WHERE nvl(username, 'SYS_BG') <> 'SYS_BG'
   and status = 'ACTIVE';

SELECT *
  FROM v$session
 WHERE nvl(username, 'SYS_BG') <> 'SYS_BG'
   and program = 'dllhost.exe' --osuser <> 'SYSTEM'
 ORDER BY status, terminal;

--当前有活动dblink的session

SELECT b.NAME, a.*
  FROM v$sesstat a, v$statname b
 WHERE a.sid = 271
   AND a.statistic# = b.statistic#
   AND b.NAME LIKE '%dblink%';

--长时间session集中的对象:

SELECT target, COUNT(*) FROM V$SESSION_LONGOPS t GROUP BY t.target;

--未执行完的正在执行的操作:
SELECT * FROM V$SESSION_LONGOPS t WHERE sofar <> totalwork;

--OSSTAT
select * from v$osstat order by value desc;

--会话的高负载事件:
SELECT b.NAME, a.VALUE
  FROM v$sesstat a, v$statname b
 WHERE a.sid = &sid --sys_context('userenv','sid')
   AND a.statistic# = b.statistic#
   AND a.VALUE > 10
 ORDER BY VALUE DESC;

--全表(索引)扫描:
SELECT obj.owner,
       obj.object_name,
       COUNT(*),
       (SELECT round(SUM(seg.bytes) / 1024 / 1024, 2)
          FROM dba_segments seg
         WHERE seg.owner = obj.owner
           AND seg.segment_name = obj.object_name) objsize_m
  FROM dba_objects obj, sys.x$bh xbh
 WHERE obj.object_type IN ('TABLE', 'INDEX')
   AND xbh.obj = obj.data_object_id
   AND bitand(xbh.flag, 524288) > 0
   AND obj.owner IN ('UNAME')
 GROUP BY obj.owner, obj.object_name
 ORDER BY 3 DESC;

--热点对象(9i after):
SELECT *
  FROM v$segment_statistics
 WHERE owner = upper('helios')
 ORDER BY VALUE DESC;

--查询一个存储过程是否在运行
select *
  from v$db_object_cache
 where locks > 0
   and pins > 0
   and type = 'PROCEDURE'

--==某个session情况(Linux top 诊断高负载session进程得出spid后)==--

--查询session当前、前一个执行的SQL:

  SELECT /*+ ORDERED */
         sql_text
          FROM v$sqltext a
         WHERE (a.hash_value, a.address) IN
               (SELECT DECODE(sql_hash_value,
                              0,
                              prev_hash_value,
                              sql_hash_value),
                       DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
                  FROM v$session b
                 WHERE b.paddr =
                       (SELECT addr FROM v$process c WHERE c.spid = '&spid'))
         ORDER BY piece ASC; --os thread id as input

--某会话正在执行的SQL:
SELECT sid, sql_text
  FROM v$session s, v$sql q
 WHERE sid IN (&sid)
   AND (q.sql_id = s.sql_id OR q.sql_id = s.prev_sql_id);

--OS thread ID当前活动会话执行的SQL
SELECT s.sid, q.sql_text, s.machine, s.program, q.OUTLINE_CATEGORY
  FROM v$session s, v$sql q
 WHERE nvl(s.username, 'SYS') <> 'SYS'
   and s.status = 'ACTIVE'
   AND (q.sql_id = s.sql_id OR q.sql_id = s.prev_sql_id);

SELECT A.SID, A.SERIAL#
  FROM V$SESSION A, V$PROCESS B
 WHERE A.PADDR = B.ADDR
   AND B.SPID = &SPID; --OS thread id as input

--session当前正在等待事件
SELECT T.EVENT,
       SUM(DECODE(T.WAIT_TIME, 0, 1, 0)) CURR,
       SUM(DECODE(T.WAIT_TIME, 0, 0, 1)) PREV,
       COUNT(*) TOTAL
  FROM V$SESSION_WAIT T
 WHERE T.SID = &SID
   AND T.EVENT NOT IN ('rdbms ipc message',
                       'SQL*Net message from client',
                       'smon timer',
                       'pmon timer',
                       'wakeup time manager')
 GROUP BY T.EVENT
HAVING SUM(DECODE(T.WAIT_TIME, 0, 1, 0)) > 0
 ORDER BY 2 DESC;

--===Session级别top统计===---

--session自启动以来等待事件统计信息(时间单位1/100s)

SELECT S.USERNAME,
       S.PROGRAM,
       S.STATUS,
       /*SE.EVENT,
       SE.TOTAL_WAITS,
       SE.TOTAL_TIMEOUTS,
       SE.TIME_WAITED,
       SE.AVERAGE_WAIT*/
       SE.*
  FROM V$SESSION S, V$SESSION_EVENT SE
 WHERE S.SID = SE.SID
   AND SE.EVENT NOT LIKE 'SQL*Net%'
   AND S.STATUS = 'ACTIVE'
   AND S.USERNAME IS NOT NULL
 ORDER BY 2 ASC, 6 DESC;

--查看占用系统io较大的session

SELECT SE.SID,
       SE.SERIAL#,
       PR.SPID,
       SE.USERNAME,
       SE.STATUS,
       SE.TERMINAL,
       SE.PROGRAM,
       SE.MODULE,
       SE.SQL_ADDRESS,
       ST.EVENT,
       ST.P1TEXT,
       SI.PHYSICAL_READS,
       SI.BLOCK_CHANGES
  FROM V$SESSION SE,  V$SESSION_WAIT ST, V$SESS_IO SI, V$PROCESS PR
 WHERE ST.SID = SE.SID  AND ST.SID = SI.SID
   AND SE.PADDR = PR.ADDR
   AND SE.SID > 6 AND ST.WAIT_TIME = 0
   AND ST.EVENT NOT LIKE '%SQL%'
 ORDER BY PHYSICAL_READS DESC;

--找出耗cpu较多的session

SELECT A.SID,
       SPID,
       STATUS,
       SUBSTR(A.PROGRAM, 1, 40) PROG,
       A.TERMINAL,
       OSUSER,
       ROUND(VALUE / 60 / 100, 4) VALUE_MINS
  FROM V$SESSION A, V$PROCESS B, V$SESSTAT C
 WHERE C.STATISTIC# = 12
   AND C.SID = A.SID
   AND A.PADDR = B.ADDR
 ORDER BY VALUE DESC;

--Top 10 by Buffer Gets的SQL(使用hash算法从内存读取,耗cpu)

SELECT *
  FROM (SELECT substr(sql_text, 1, 40) sql,
               buffer_gets,
               executions,
               buffer_gets / executions "Gets/Exec",
               hash_value,
               address
          FROM V$SQLAREA
         WHERE buffer_gets > 10000
         ORDER BY buffer_gets DESC)
 WHERE rownum <= 10;

--Top 10 by Physical Reads SQL(磁盘io多)

SELECT *
  FROM (SELECT substr(sql_text, 1, 40) sql,
               disk_reads,
               executions,
               disk_reads / executions "Reads/Exec",
               hash_value,
               address
          FROM V$SQLAREA
         WHERE disk_reads > 1000
         ORDER BY disk_reads DESC)
 WHERE rownum <= 10;

--Top 10 by Parse Calls SQL:

SELECT *
  FROM (SELECT substr(sql_text, 1, 40) sql,
               parse_calls,
               executions,
               hash_value,
               address
          FROM V$SQLAREA
         WHERE parse_calls > 1000
         ORDER BY parse_calls DESC)
 WHERE rownum <= 10;

--Top 10 by Executions SQL:

SELECT *
  FROM (SELECT substr(sql_text, 1, 40) sql,
               executions,
               rows_processed,
               rows_processed / executions "Rows/Exec",
               hash_value,
               address
          FROM V$SQLAREA
         WHERE executions > 100
         ORDER BY executions DESC)
 WHERE rownum <= 10;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值