ORACLE 常用的查询操作

等待事件

查询数据库等待时间和实际执行时间的相对百分比

select *
  from v$sysmetric a
 where a.METRIC_NAME in
       ('Database CPU Time Ratio', 'Database Wait Time Ratio')
   and a.INTSIZE_CSEC = (select max(intsize_csec) from v$sysmetric);

查询数据库中过去30分钟引起最多等待的sql语句

select ash.USER_ID,
       u.username,
       sum(ash.WAIT_TIME) ttl_wait_time,
       s.SQL_TEXT
  from v$active_session_history ash, v$sqlarea s, dba_users u
 where ash.SAMPLE_TIME between sysdate - 60 / 2880 and sysdate
   and ash.SQL_ID = s.SQL_ID
   and ash.USER_ID = u.user_id
 group by ash.USER_ID, s.SQL_TEXT, u.username
 order by ttl_wait_time desc

查询数据库中的等待事件

select event, count(*)
  from v$session_wait
 group by event
 order by count(*) desc

利用等待事件查询导致等待的sql

select sql_text
  from V$sqlarea
 where (address, hash_value) in
       (select sql_address, sql_hash_value
          from v$session
         where event like '%sequential%');
         
select sql_address, sql_hash_value
  from v$session
 where event like '%sequential%'

查询数据库过去15分钟最重要的等待事件

select ash.EVENT, sum(ash.WAIT_TIME + ash.TIME_WAITED) total_wait_time
  from v$active_session_history ash
 where ash.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate
 group by event
 order by total_wait_time desc

在过去15分钟哪些用户经历了等待

select s.SID,
       s.USERNAME,
       sum(ash.WAIT_TIME + ash.TIME_WAITED) total_wait_time
  from v$active_session_history ash, v$session s
 where ash.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate
   and ash.SESSION_ID = s.SID
 group by s.SID, s.USERNAME
 order by total_wait_time desc;

查询等待时间最长的对象

select a.CURRENT_OBJ#,
       d.object_name,
       d.object_type,
       a.EVENT,
       sum(a.WAIT_TIME + a.TIME_WAITED) total_wait_time
  from v$active_session_history a, dba_objects d
 where a.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate
   and a.CURRENT_OBJ# = d.object_id
 group by a.CURRENT_OBJ#, d.object_name, d.object_type, a.EVENT
 order by total_wait_time desc;

查询过去15分钟等待时间最长的sql语句

select a.USER_ID,
       u.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 u
 where a.SAMPLE_TIME between sysdate - 30 / 2880 and sysdate
   and a.SQL_ID = s.SQL_ID
   and a.USER_ID = u.user_id
 group by a.USER_ID, s.SQL_TEXT, u.username
 order by total_wait_time desc;

那些SQL消耗更多的IO

select *
  from (select s.PARSING_SCHEMA_NAME,
               s.DIRECT_WRITES,
               substr(s.SQL_TEXT, 1, 500),
               s.DISK_READS
          from v$sql s
         order by s.DISK_READS desc)
 where rownum < 20

查看哪些会话正在等待IO资源

SELECT username, program, machine, sql_id
  FROM V$SESSION
 WHERE EVENT LIKE 'db file%read';

查看正在等待IO资源的对象

SELECT d.object_name, d.object_type, d.owner
  FROM V$SESSION s, dba_objects d
 WHERE EVENT LIKE 'db file%read'
   and s.ROW_WAIT_OBJ# = d.object_id

查看redo日志切换频率

Select round(FIRST_TIME, 'DD'), THREAD#, Count(SEQUENCE#)
  From v$log_history
 Group By round(FIRST_TIME, 'DD'), THREAD#
 Order By 1, 2
SELECT trunc(first_time) "Date",
       to_char(first_time, 'Dy') "Day",
       count(1) "Total",
       SUM(decode(to_char(first_time, 'hh24'), '00', 1, 0)) "h0",
       SUM(decode(to_char(first_time, 'hh24'), '01', 1, 0)) "h1",
       SUM(decode(to_char(first_time, 'hh24'), '02', 1, 0)) "h2",
       SUM(decode(to_char(first_time, 'hh24'), '03', 1, 0)) "h3",
       SUM(decode(to_char(first_time, 'hh24'), '04', 1, 0)) "h4",
       SUM(decode(to_char(first_time, 'hh24'), '05', 1, 0)) "h5",
       SUM(decode(to_char(first_time, 'hh24'), '06', 1, 0)) "h6",
       SUM(decode(to_char(first_time, 'hh24'), '07', 1, 0)) "h7",
       SUM(decode(to_char(first_time, 'hh24'), '08', 1, 0)) "h8",
       SUM(decode(to_char(first_time, 'hh24'), '09', 1, 0)) "h9",
       SUM(decode(to_char(first_time, 'hh24'), '10', 1, 0)) "h10",
       SUM(decode(to_char(first_time, 'hh24'), '11', 1, 0)) "h11",
       SUM(decode(to_char(first_time, 'hh24'), '12', 1, 0)) "h12",
       SUM(decode(to_char(first_time, 'hh24'), '13', 1, 0)) "h13",
       SUM(decode(to_char(first_time, 'hh24'), '14', 1, 0)) "h14",
       SUM(decode(to_char(first_time, 'hh24'), '15', 1, 0)) "h15",
       SUM(decode(to_char(first_time, 'hh24'), '16', 1, 0)) "h16",
       SUM(decode(to_char(first_time, 'hh24'), '17', 1, 0)) "h17",
       SUM(decode(to_char(first_time, 'hh24'), '18', 1, 0)) "h18",
       SUM(decode(to_char(first_time, 'hh24'), '19', 1, 0)) "h19",
       SUM(decode(to_char(first_time, 'hh24'), '20', 1, 0)) "h20",
       SUM(decode(to_char(first_time, 'hh24'), '21', 1, 0)) "h21",
       SUM(decode(to_char(first_time, 'hh24'), '22', 1, 0)) "h22",
       SUM(decode(to_char(first_time, 'hh24'), '23', 1, 0)) "h23"
  FROM V$log_history
 group by trunc(first_time), to_char(first_time, 'Dy')
 Order by 1
事物与锁

查找堵塞的sql语句

select *
  from (select d.BLOCKING_SESSION,
               b.*,
               c.object_id,
               c.object_type,
               c.object_name,
               c.owner,
               d.client_info,
               d.MACHINE,
               d.status,
               d.TERMINAL,
               d.PROCESS,
               d.EVENT,
               d.WAIT_TIME,
               -- d.BLOCKING_SESSION, 
               d.sql_id,
               d.prev_sql_id,
               e.SQL_TEXT
          from v$locked_object a,
               v$lock          b,
               dba_objects     c,
               v$session       d,
               v$sql           e
         where a.session_id = b.sid
           and a.session_id = d.sid
           and a.object_id = c.object_id
           and d.sql_id = e.sql_id)
 where blocking_session <> 0
    or request <> 0
    or block <> 0

根据堵塞ID找到堵塞sql,(sql_id:堵塞sql)

 select BLOCKING_SESSION,prev_sql_id,sql_id,MACHINE ,a.* from v$session a  where a.sid in ('783'
查看堵塞的sql(sql_id)
select dbms_lob.substr(sql_fulltext) ,sql_id from v$sql where sql_id in ('4u7v9vsq5wzrt')

根据第一个查找堵塞sql找到需杀进程(SID和SERIAL#字段复制,SID在前面,SERIAL#在后面)

  alter system kill session '2010,11599' immediate;

select * from t_automaticmatching_thread t where t.autosyn is not null

查看数据库产生锁的SID,SERIAL#,表名,用户名和锁的级别。

select s.sid,
       s.serial#,
       s. username,
       l.locked_mode,
       o.object_name,
       o.owner,
       s.machine
  from v$locked_object l, v$session s, dba_objects o
 where l.session_id = s.sid
   and l.object_id = o.object_id

查被锁的对象

select l.xidusn, l.object_id, o.owner, o.object_name, 
l.session_id, l.oracle_username, l.os_user_name, l.process, 
decode(l.locked_mode, 0, '',
        1, 'NULL',
        2, '(SS)',
        3, '(SX)',
        4, '(S)',
        5, '(SSX)',
        6, '(X)',
        '???') locked_mode
from v$locked_object l, dba_objects o
where l.object_id = o.object_id;

解锁

alter system kill session '301,60720'  

根据sid 查sql_text

select sql_text
  from v$sqlarea a, v$session b
 where a.SQL_ID = b.PREV_SQL_ID
   and b.SID =2199;

产生锁的sql

select sql_text
  from v$sql
 where hash_value in
       (select sql_hash_value
          from v$session
         where sid in (select session_id from v$locked_object))
select s.sid, s.serial#, s.machine, s.username, sq.sql_text
  from v$session s, v$locked_object l, v$sql sq
 where s.sid = l.session_id
   and sq.hash_value = s.sql_hash_value;
alter system kill session '11,33216' immediate;

查看会话阻塞–谁阻塞了谁(单机)

SELECT s1.username || '@' || s1.machine || ' ( SID=' || s1.sid ||
       ' ) is blocking ' || s2.username || '@' || s2.machine || ' ( SID=' ||
       s2.sid || ' ) ' AS blocking_status
  FROM v$lock l1, v$session s1, v$lock l2, v$session s2
 WHERE s1.sid = l1.sid
   AND s2.sid = l2.sid
   AND l1.BLOCK = 1
   AND l2.request > 0
   AND l1.id1 = l2.id1
   AND l2.id2 = l2.id2;

数据库资源消耗

SELECT b.SQL_FULLTEXT,
       B.SQL_TEXT,
       'alter system kill session ''' || A.SID || ',' || A.SERIAL# || '''' ||
       ' immediate;' || '',
       A.USERNAME,
       A.COMMAND,
       A.STATUS,
       A.PROGRAM,
       A.MACHINE,
       A.CLIENT_IDENTIFIER,
       B.CPU_TIME,
       B.SHARABLE_MEM,
       ROUND((B.DISK_READS + B.BUFFER_GETS) / B.EXECUTIONS) AS RESOURCE_COST
  FROM V$SESSION A, V$SQLSTATS B
 WHERE A.SQL_ID = B.SQL_ID
   AND B.EXECUTIONS > 0
   AND A.WAIT_CLASS <> 'Idle'
 ORDER BY RESOURCE_COST DESC;
SELECT s.username, 
       l.OBJECT_ID,
       l.SESSION_ID,
       s.SERIAL#,
       l.ORACLE_USERNAME,
       l.OS_USER_NAME,
       l.PROCESS
  FROM V$LOCKED_OBJECT l, V$SESSION S
 WHERE l.SESSION_ID = S.SID;

解锁

alter system kill session '1339,428'  

批量解锁

declare
  cursor mycur is
    select b.sid,
           b.serial#   from v$locked_object a,
           v$session b   where a.session_id = b.sid group by b.sid,
           b.serial#;
begin
  for cur in mycur loop
    execute immediate ('alter system  kill session  ''' || cur.sid || ',' ||
                      cur.SERIAL# || ''' ') || 'immediate';
  end loop;
end;

查看会话连接用户名 --应用程序名–机器名–操作系统用户–登录时间

select sid, serial#, username, program, machine, osuser, logon_time
  from v$session;

oracle中正在执行的sql

select a.program, b.spid, c.sql_text, c.SQL_ID
  from v$session a, v$process b, v$sqlarea c
 where a.paddr = b.addr
   and a.sql_hash_value = c.hash_value
   and a.username is not null;

查询Oracle正在执行的sql语句及执行该语句的用户

SELECT b.sid, ---- oracleID,  
       b.username, ---- Oracle用户,  
       b.serial#,
       spid, ------ 操作系统ID,  
       paddr,
       sql_text, ----- 正在执行的SQL,  
       b.machine ----- 计算机名  
  FROM v$process a, v$session b, v$sqlarea c
 WHERE a.addr = b.paddr
   AND b.sql_hash_value = c.hash_value;
SELECT b.sid, b.username, b.serial#, spid, paddr, sql_text, b.machine
  FROM v$process a, v$session b, v$sqlarea c
 WHERE a.addr = b.paddr
   AND b.sql_hash_value = c.hash_value;

看正在执行sql的发起者的发放程序

SELECT A.serial#,
       OSUSER, ----电脑登录身份,
       PROGRAM, ----发起请求的程序,  
       USERNAME, ----登录系统的用户名,  
       SCHEMANAME,
       B.Cpu_Time, ---花费cpu的时间,  
       STATUS,
       B.SQL_TEXT ------执行的sql  
  FROM V$SESSION A
  LEFT JOIN V$SQL B
    ON A.SQL_ADDRESS = B.ADDRESS
   AND A.SQL_HASH_VALUE = B.HASH_VALUE
 ORDER BY b.cpu_time DESC

查看正在执行的sql的进度

SELECT SE.SID,
       OPNAME,
       TRUNC(SOFAR / TOTALWORK * 100, 2) || '%' AS PCT_WORK,
       ELAPSED_SECONDS ELAPSED,
       ROUND(ELAPSED_SECONDS * (TOTALWORK - SOFAR) / SOFAR) REMAIN_TIME,
       SQL_TEXT
  FROM V$SESSION_LONGOPS SL, V$SQLAREA SA, V$SESSION SE
 WHERE SL.SQL_HASH_VALUE = SA.HASH_VALUE
   AND SL.SID = SE.SID
   AND SOFAR != TOTALWORK
 ORDER BY START_TIME;
select t2.username, t2.sid, t2.serial#, t2.logon_time
  from v$locked_object t1, v$session t2
 where t1.session_id = t2.sid
 order by t2.logon_time;

查看最耗时的sql

select *
  from (select v.sql_id,
               v.child_number,
               v.sql_text,
               v.elapsed_time,
               v.cpu_time,
               v.disk_reads,
               rank() over(order by v.cpu_time desc) elapsed_rank
          from v$sql v) a
 where elapsed_rank <= 20;

查看大事务

select start_date,addr,used_urec,used_ublk from v$transaction;
select sql_child_number,
       sid,
       sql_id,
       last_call_et,
       blocking_session,
       blocking_instance,
       state,
       event,
       p1,
       p2,
       seconds_in_wait
  from v$session
 where taddr = '0000000A678163E0';

根据sql_id 查看sql的执行计划

select * from table(dbms_xplan.display_cursor('f2d30pd3wm699'));
select sql_text from v$sql where sql_id = 'f2d30pd3wm699';
select sql_id, sql_text from v$sql where sql_id = 'f2d30pd3wm699'
select a.program, b.spid, c.sql_text, c.SQL_ID
  from v$session a, v$process b, v$sqlarea c
 where a.paddr = b.addr
   and a.sql_hash_value = c.hash_value
   and a.username is not null;

查看当前等待事件

select event, sql_id, count(*)
  from v$session
 where wait_class <> 'Idle'
 group by event, sql_id
 order by 1, 2, 3;

历史等待事件视图
dba_hist_active_sess_history

–查看会话阻塞–谁阻塞了谁(单机)

SELECT s1.username || '@' || s1.machine || ' ( SID=' || s1.sid ||
       ' ) is blocking ' || s2.username || '@' || s2.machine || ' ( SID=' ||
       s2.sid || ' ) ' AS blocking_status
  FROM v$lock l1, v$session s1, v$lock l2, v$session s2
 WHERE s1.sid = l1.sid
   AND s2.sid = l2.sid
   AND l1.BLOCK = 1
   AND l2.request > 0
   AND l1.id1 = l2.id1
   AND l2.id2 = l2.id2;

根据sid 查sql_text

select sql_text
  from v$sqlarea a, v$session b
 where a.SQL_ID = b.PREV_SQL_ID
   and b.SID = 1813;

通过sid找到阻塞文本

SELECT sql_id, sql_text FROM v$sqltext WHERE sql_id = '485' ORDER BY piece;

查看阻塞对象信息

SELECT owner, object_name, object_type
  FROM dba_objects
 WHERE object_id in (SELECT object_id FROM v$locked_object);
SELECT sid, total_waits, time_waited
  FROM v$session_event
 WHERE event = 'db file sequential read'
   and total_waits > 0
 ORDER BY 3, 2;
select ash.USER_ID,
       u.username,
       sum(ash.WAIT_TIME) ttl_wait_time,
       s.SQL_TEXT
  from v$active_session_history ash, v$sqlarea s, dba_users u
 where ash.SAMPLE_TIME between sysdate - 60 / 2880 and sysdate
   and ash.SQL_ID = s.SQL_ID
   and ash.USER_ID = u.user_id
 group by ash.USER_ID, s.SQL_TEXT, u.username
 order by ttl_wait_time desc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值