【Oracle SQL】session相关


一、查询正在执行的SQL

--查询Oracle正在执行的sql语句及执行该语句的用户
SELECT b.sid
       , b.serial#       	
       , a.spid       操作系统PID
       , b.username
       , b.status
       , c.sql_text		
       , b.machine		计算机名
       , b.port            
       , o.object_name
       , b.logon_time	登录数据库时间 
       , a.pga_used_mem
FROM v$process a, v$session b, v$sqlarea c, dba_objects o
WHERE a.addr = b.paddr --process address该session对应的进程地址,关联v$process的addr可以查出对应的操作系统进程PID
AND b.sql_hash_value = c.hash_value(+)
and b.plsql_entry_object_id = o.object_id(+);

--查看正在执行sql的发起者的发放程序
SELECT a.sid
       , a.serial#
       , a.username
       , a.schemaname
       , b.cpu_time
       , a.status
       , a.sql_id
       , b.sql_text
       , a.osuser           电脑登录身份      
       , a.program          发起请求的程序
       , a.machine          计算机名
       , a.logon_time       登录数据库的时间
       , a.sql_exec_start
       , a.event       
       , a.plsql_entry_object_id
       , a.plsql_object_id
       , o.object_name
       , a.blocking_session
       , b.buffer_gets      内存使用量
FROM v$session a
LEFT JOIN v$sql b ON a.sql_address = b.address AND a.sql_hash_value = b.hash_value
LEFT JOIN dba_objects o on a.plsql_entry_object_id = o.object_id
WHERE a.status = 'ACTIVE'
ORDER BY b.cpu_time DESC;

二、查询锁

0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多

--单实例:查出oracle当前的被锁对象
SELECT l.session_id sid
       , s.serial#
       , l.locked_mode 锁模式
       , l.oracle_username 登录用户
       , l.os_user_name 登录机器用户名
       , s.machine 机器名
       , s.terminal 终端用户名
       , o.object_name 被锁对象名
       , s.logon_time 登录数据库时间
       , s.sql_exec_start
       , s.event
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
ORDER BY sid, s.serial#;

--RAC:查出oracle当前的被锁对象
SELECT s.inst_id,
       l.session_id sid,
       s.serial#,
       l.locked_mode 锁模式,
       l.oracle_username 登录用户,
       s.machine 机器名,
       l.os_user_name 登录机器用户名,
       s.terminal 终端用户名,
       o.object_name 被锁对象名,
       s.logon_time 登录数据库时间
FROM gv$locked_object l, dba_objects o, gv$session s
WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
ORDER BY sid, s.serial#; 

select vs.inst_id,
       vs.sid,
       vs.serial#,
       vl.locked_mode 锁模式,
       vl.oracle_username 登录用户,       
       vs.machine 机器名,
       vl.os_user_name 登录机器用户名,
       vs.terminal 终端用户名,
       b.owner,
       b.object_name,
       vs.logon_time 登录数据库时间,
       vs.program,      
       vsq.sql_text
  from gv$session vs, gv$sqlarea vsq, gv$locked_object vl, dba_objects b
 where vl.session_id = vs.sid
   and vs.prev_sql_addr = vsq.address
   and vl.object_id = b.object_id
 order by vs.sid;

--kill掉当前的锁对象可以为(sid,serial#)
alter system kill session '686,30161';

--杀进程集群 
alter system kill session 'sid,serial#, @inst_id';

三、查询会话阻塞

--会话阻塞
select distinct 
--'alter system kill session '''||a.sid||','||a.serial#||''';', 
a.sid waiting_session,
                a.serial#,
                d.sql_text waiting_query,
                a.blocking_session blocking_session,
                a.process,
                a.machine,
                a.program,
                a.inst_id,
                ROUND(a.last_call_et / 60) blocktime,
                to_char(a.logon_time, 'DD-MON-YYYY HH24:MI:SS'),
                a.event
  from gv$session a
  join gv$sql d
    on a.sql_id = d.sql_id
  --left join gv$active_session_history b
    --on a.blocking_session = b.session_id
  --left join gv$sql c
    --on c.sql_id = b.sql_id
 where a.blocking_session != 0
 order by blocktime desc

四、ASH会话历史查询

--ASH会话历史查询
SELECT instance_number
       , ash.p1
       , ash.p2
       , ash.p3
       , to_char(sample_time, 'yyyy/mm/dd hh24:mi:ss.ff') TIME
       , session_id sid
       , session_serial#
       , ash.sql_id
       , (select a.sql_text from v$sql a where a.sql_id = ash.sql_id and rownum = 1) sql_text
       , ash.program
       , en.event_name
       , ash.blocking_session
       , ash.temp_space_allocated
       , ash.machine
       , u.username
  FROM sys.WRH$_ACTIVE_SESSION_HISTORY ash, sys.wrh$_event_name en, dba_users u
 WHERE ash.event_id = en.event_id(+)
   and ash.user_id = u.user_id(+)
   AND sample_time >= to_timestamp('20240307 1300', 'yyyymmdd hh24mi')
   AND sample_time <= to_timestamp('20240307 1430', 'yyyymmdd hh24mi')
   --and session_id = 2619
 ORDER BY sample_time;


--定位不知源头的sql
SELECT sql_id, plsql_entry_object_id FROM dba_hist_active_sess_history;


SELECT * FROM dba_objects where object_id = 8390;

四、查询sql的物理读和IO等待

--查询sql的物理读和IO等待
SELECT s.instance_number,
       s.snap_id,
       to_char(ss.begin_interval_time, 'yyyy-mm-dd hh24:mi:ss') begin_interval_time,
       to_char(ss.end_interval_time, 'yyyy-mm-dd hh24:mi:ss') end_interval_time,
       SUM(DISK_READS_TOTAL) DISK_READS_TOTAL,
       SUM(DISK_READS_DELTA) DISK_READS_DELTA,
       SUM(IOWAIT_TOTAL) IOWAIT_TOTAL,
       SUM(IOWAIT_DELTA) IOWAIT_DELTA
  FROM dba_hist_sqlstat s, dba_hist_snapshot ss
 WHERE s.snap_id = ss.snap_id
   AND s.dbid = ss.dbid
   AND s.instance_number = ss.instance_number
   AND to_char(ss.begin_interval_time, 'yyyy-mm-dd hh24:mi') >= '2024-03-08 00:00'
   AND s.instance_number = 2
 GROUP BY s.instance_number,s.snap_id, ss.begin_interval_time, ss.end_interval_time;

五、查询UNDO占用SQL

--查询UNDO占用SQL
SELECT DISTINCT s.machine,
                s.program,
                s.sid,
                s.SERIAL#,
                ROUND(t.used_ublk * 8 / 1024, 2) undo_MB,
                t.used_urec undo_records,
                s.status,
                l.sql_text
  FROM gv$transaction t, gv$session s, gv$sqlstats l
 WHERE t.ses_addr = s.saddr
   AND s.sql_id = l.sql_id(+)
 ORDER BY undo_MB;
 
--查询undo回退情况
select * from gv$fast_start_transactions;

六、查询事务占用情况

--事务占用情况查询
SELECT b.tablespace
       , b.segfile#
       , b.segblk#
       , b.blocks
       , a.sid
       , a.serial#
       , a.username
       , a.osuser
       , a.status
       , c.sql_text
  FROM v$session a, v$sort_usage b, v$sql c
 WHERE a.saddr = b.session_addr
   AND a.sql_address = c.address(+)
 ORDER BY b.tablespace, b.segfile#, b.segblk#, b.blocks; 

--查询某天的事务总数
select instance_number
      , metric_unit
      , trunc(begin_time) time
      , avg(average) * 60 * 60 * 24 "Transactions Per Day"
from DBA_HIST_SYSMETRIC_SUMMARY
where metric_unit = 'Transactions Per Second'
 and begin_time >= to_date('2021-12-16 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
 and begin_time < to_date('2021-12-17 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
group by instance_number, metric_unit, trunc(begin_time)

--查询当前正在执行的事务:
SELECT s.sid,
       s.serial#,
       s.event,
       a.sql_text,
       a.sql_fulltext,
       s.username,
       s.status,
       s.machine,
       s.terminal,
       s.program,
       a.executions,
       s.sql_id,
       p.spid,
       a.direct_writes
  FROM (SELECT * FROM v$session WHERE status = 'ACTIVE') s
  LEFT JOIN v$sqlarea a
    ON s.sql_id = a.sql_id
 INNER JOIN v$process p
    ON s.paddr = p.addr;

--查看Oracle数据库中的长事务:
with transaction_details as
 (select inst_id, ses_addr, sysdate - start_date as diff from gv$transaction)
select s.username,
       to_char(trunc(t.diff)) || ' days, ' ||
       to_char(trunc(mod(t.diff * 24, 24))) || ' hours, ' ||
       to_char(trunc(mod(t.diff * 24 * 60, 24))) || ' minutes, ' ||
       to_char(trunc(mod(t.diff * 24 * 60 * 60, 60))) || ' seconds' as transaction_duration,
       s.program,
       s.terminal,
       s.status,
       s.sid,
       s.serial#
  from gv$session s, transaction_details t
 where s.inst_id = t.inst_id
   and s.saddr = t.ses_addr
 order by t.diff desc;

--查询长事务SQL:
with ltr as
 (select to_char(sysdate, 'YYYYMMDDHH24MISS') TM,
         s.sid,
         s.sql_id,
         s.sql_child_number,
         s.prev_sql_id,
         xid,
         to_char(t.start_date, 'YYYYMMDDHH24MISS') start_time,
         e.TYPE,
         e.block,
         e.ctime,
         decode(e.CTIME, 0, (sysdate - t.start_date) * 3600 * 24, e.ctime) el_second
  --  q.sql_text 
    from v$transaction t, v$session s, v$transaction_enqueue e
   where t.start_date <= sysdate - interval '100' second /*查询开始多少秒的事务*/
     and t.addr = s.taddr
        --and s.sql_child_number = q.CHILD_NUMBER(+) 
        --and s.sql_id = q.sql_id(+) and s.prev_sql_id = q.sql_id(+) 
     and t.addr = e.addr(+))
select ltr.*,
       (select q1.sql_text
          from v$sql q1
         where ltr.prev_sql_id = q1.sql_id(+)
           and rownum = 1) prev_sql_text,
       (select q1.sql_text
          from v$sql q1
         where ltr.sql_id = q1.sql_id(+)
           and ltr.sql_child_number = q1.CHILD_NUMBER(+)) sql_text
  from ltr ltr;

七、查询会话占用内存

SELECT s.server "连接类型",
       s.username,
       s.status,
       s.logon_time,
       s.machine,
       s.port,
       osuser,
       name,
       st.value/1024/1024 "占用内存MB",
       s.sid,
       s.serial#,
       spid "操作系统PID",
       p.pga_used_mem,
       p.pga_alloc_mem,
       p.pga_freeable_mem,
       p.pga_max_mem
  FROM v$session s, v$sesstat st, v$statname sn, v$process p
 WHERE st.sid = s.sid
   AND st.statistic# = sn.statistic#
   AND sn.name = 'session pga memory'
   AND p.addr = s.paddr
 ORDER BY VALUE DESC; 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值