专栏首页bisal的个人杂货铺SQL工具集-查询会话等待

SQL工具集-查询会话等待

OLTP系统中,经常碰到的一种场景,就是某个操作卡住了,再从日志定位,很可能就看到是在执行某个增删改的数据库操作的时候出现hang的问题。

对于数据库中的这个场景,卡住的会话,通常是在等什么,在Oracle中,就会出现所谓的等待事件,如何快速定位会话的等待事件以及等待链?今天介绍的SQL就是为解决这个问题。

示例如下,会话1,执行update,更新id=1的记录,未提交/回滚,

SQL> update a set id=1 where id=1;
1 row updated.


SQL> select * from dual;
D
-
X

会话2,执行update,更新相同的id=1记录,此时的会话,hang住了,

SQL> update a set id=1 where id=1;

会话3,执行update,继续要更新id=1,还是hang了,

SQL> update a set id=1 where id=1;

SQL来了,

WITH
    blockers_and_blockees
    AS
        (SELECT ROWNUM rn, a.*
           FROM gv$session a
          WHERE blocking_session_status = 'VALID'
             OR (inst_id, sid) IN (SELECT blocking_instance, blocking_session
                                     FROM gv$session
                                    WHERE blocking_session_status = 'VALID'))
    SELECT LPAD(' ', 3 * (LEVEL - 1)) || sid || DECODE(LEVEL, 1, ' root blocker')
               blocked_session,
           inst_id,
           event,
              TO_CHAR(FLOOR(seconds_in_wait / 3600), 'fm9900')
           || ':'
           || TO_CHAR(FLOOR(MOD(seconds_in_wait, 3600) / 60), 'fm00')
           || ':'
           || TO_CHAR(MOD(seconds_in_wait, 60), 'fm00')
               time_in_wait,
           username,
           osuser,
           machine,
           (SELECT owner || '.' || object_name
              FROM dba_objects
             WHERE object_id = b.row_wait_obj#)
               waiting_on_object,
           CASE
               WHEN row_wait_obj# > 0
               THEN
                   DBMS_ROWID.rowid_create(1,
                                           row_wait_obj#,
                                           row_wait_file#,
                                           row_wait_block#,
                                           row_wait_row#)
           END
               waiting_on_rowid,
           (SELECT sql_text
              FROM gv$sql s
             WHERE s.sql_id = b.sql_id AND s.inst_id = b.inst_id AND s.child_number = b.sql_child_number)
               current_sql,
           status,
           serial#,
           (SELECT spid
              FROM gv$process p
             WHERE p.addr = b.paddr AND p.inst_id = b.inst_id)
               os_process_id
      FROM blockers_and_blockees b
CONNECT BY PRIOR sid = blocking_session AND PRIOR inst_id = blocking_instance
START WITH blocking_session IS NULL;

其中,

BLOCKED_SESSION:阻塞的会话,并且支持缩进,第一行是root blocker,自上而下,逐层等待。

INST_ID:实例ID,对单实例数据库,就是1。

EVENT:该会话等待的等待事件。

TIME_IN_WAIT:该会话的等待时间。

USERNAME:会话使用的数据库账号。

OSUER:会话使用的操作系统账号。

MACHINE:会话所在主机名。

WAITING_ON_OBJECT:会话等待的数据库对象。

WAITING_ON_ROWID:会话等待的记录rowid。

CURRENT_SQL:会话当前执行的SQL。

STATUS:会话当前的状态。

SERIAL#:会话的SERIAL#。

OS_PROCESS_ID:会话的操作系统进程ID。

SQL的执行结果,通过PLSQL Developer,看得清晰一些,会话2和会话3的等待事件都是"enq: TX - row lock contention",行锁争用,而当前行的行锁持有者是会话1,等待链是"会话3等待会话2,会话2等待会话1",从WAITING_ON_OBJECT和WAITING_ONROWID可以知道,这几个会话都在对BISAL_A表的这个rowid对应的行在进行操作,

另外,可以看到,SQL中用的视图都是gv,因此这条SQL不仅支持单实例,而且支持RAC。因此,这条SQL,功能还是很强大,能告诉我们很多关于会话等待的信息,推荐指数5颗星。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个执行计划异常变更的案例 - 外传之SQL Profile(下)

    之前的几篇文章: 《一个执行计划异常变更的案例 - 前传》 《一个执行计划异常变更的案例 - 外传之绑定变量窥探》 《一个执行计划异常变更的案例 -...

    bisal
  • 一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法

    《一个执行计划异常变更的案例 - 外传之rolling invalidation》

    bisal
  • 一个执行计划异常变更的案例 - 外传之SQL Profile(上)

    之前的几篇文章: 《一个执行计划异常变更的案例 - 前传》 《一个执行计划异常变更的案例 - 外传之绑定变量窥探》 《一个执行计划异常变更的案例 -...

    bisal
  • 《数据可视化基础》第三章:图形颜色如何选择

    我们经常使用颜色来区分没有顺序的离散的分组。例如地图上的不同国家或某种产品的不同制造商。在这种情况下,我们使用定性颜色标度(qualitative color ...

    医学数据库百科
  • 对某CMS的审计

    太久没有关注各大安全博客上的内容了(当咸鱼是真的快乐呀~),今天瞎逛,发现有师傅发了一篇关于某CMS审计的文章,我的确是几个月没有审过代码了,就寻思着跟着这篇文...

    tnt阿信
  • 10道题搞懂色彩搭配的6大准则,让你的图表开口说话!

    导读:如果你有时间只专注于改进图表中的一件事,那就选择改进颜色。大多数软件无法直观地挑选与你的背景匹配的颜色。

    华章科技
  • 纷享销客罗旭:数字化时代的销售增长|腾讯SaaS加速器·CEO说

    ? 来源 | 腾讯SaaS加速器首期项目-纷享销客 ---- 疫情对很多企业的正常生产经营造成很大影响,近日36氪发起暖冬计划“超长增长季”,纷享销客创始人&...

    腾讯SaaS加速器
  • 正确的配色多重要?直接影响产品转化率

    首先看两张图,感受下配色的重要性。 “看这张,是不是很有食欲?” ? “那这张呢?” ? “没上张让人有食欲。” 其实每个人的心里,都有一张色彩心理学。 ? ...

    BestSDK
  • 2019年5月GitHub上最热门的Java开源项目

    又到了为大家盘点5月份GitHub上最热门的Java开源项目的时候了,一起来看看你都知道哪些,或者有哪些你已经在使用的了。

    Java团长
  • [剑指offer] 替换空格

    请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

    尾尾部落

扫码关注云+社区

领取腾讯云代金券