前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试823】在Oracle中,如何查看过去某一段时间数据库系统的会话是否有问题?

【DB笔试面试823】在Oracle中,如何查看过去某一段时间数据库系统的会话是否有问题?

作者头像
AiDBA宝典
发布2020-06-17 15:20:55
1.9K0
发布2020-06-17 15:20:55
举报
文章被收录于专栏:小麦苗的DB宝专栏

题目部分

【DB笔试面试823】在Oracle中,如何查看过去某一段时间数据库系统的会话是否有问题?

答案部分

可以通过DBA_HIST_ACTIVE_SESS_HISTORY视图来进行查询,首先查询指定时间段的等待事件,下例中的SQL语句查询的是2016年5月10号下午17点30分到19点30分这段时间内数据库的等待事件和SQL的执行情况,其中,COUNTS列的值比较大的就是SQL执行时间较长的,需要特别关注:

代码语言:javascript
复制
SELECT D.EVENT, D.SQL_ID, COUNT(1) COUNTS
  FROM DBA_HIST_ACTIVE_SESS_HISTORY D
  WHERE D.SAMPLE_TIME >= TO_DATE('2016-05-10 17:30:00', 'YYYY-MM-DD HH24:MI:SS')
  AND    D.SAMPLE_TIME <= TO_DATE('2016-05-10 19:30:00', 'YYYY-MM-DD HH24:MI:SS')
 GROUP  BY D.EVENT,D.SQL_ID;

下面的SQL语句可以查询到具体SQL的扫描操作,初步预估SQL问题:

代码语言:javascript
复制
SELECT TO_CHAR(D.SAMPLE_TIME, 'YYYY-MM-DD HH24:MI:SS') SAMPLE_TIME,
       D.SQL_ID,
       D.SQL_PLAN_HASH_VALUE,
       D.SQL_PLAN_OPERATION,
       D.SQL_PLAN_OPTIONS,
       D.EVENT 
  FROM DBA_HIST_ACTIVE_SESS_HISTORY D
 WHERE D.SAMPLE_TIME >= TO_DATE('2016-05-10 17:30:00', 'YYYY-MM-DD HH24:MI:SS')
   AND D.SAMPLE_TIME <= TO_DATE('2016-05-10 19:30:00', 'YYYY-MM-DD HH24:MI:SS')
 ORDER BY D.SNAP_ID;

根据以上的SQL语句可以知道,对表做的是否是全表扫描,以及当时会话的等待事件是什么,然后就可以根据等待事件进行SQL分析了。

如下的SQL语句可以查询某一段时间内,会话所持有的锁信息:

代码语言:javascript
复制
SELECT D.SQL_ID,
        CHR(BITAND(P1, -16777216) / 16777215) ||CHR(BITAND(P1, 16711680) / 65535) "Lock",
        BITAND(P1, 65535) "Mode",
        COUNT(1) COUNTS,
        COUNT(DISTINCT D.SESSION_ID) COUNTS1
   FROM DBA_HIST_ACTIVE_SESS_HISTORY D
  WHERE D.SAMPLE_TIME >= TO_DATE('2016-05-10 17:30:00', 'YYYY-MM-DD HH24:MI:SS')
    AND D.SAMPLE_TIME <= TO_DATE('2016-05-10 19:30:00', 'YYYY-MM-DD HH24:MI:SS')
    AND D.EVENT = 'enq: TX - row lock contention'
  GROUP BY D.SQL_ID,
           (CHR(BITAND(P1, -16777216) / 16777215) ||
           CHR(BITAND(P1, 16711680) / 65535)),
           (BITAND(P1, 65535));

如下的SQL语句可以查询系统问题时间段内的会话详情:

代码语言:javascript
复制
SELECT D.CURRENT_OBJ#,
       D.CURRENT_FILE#,
       D.CURRENT_BLOCK#,
       D.CURRENT_ROW#,
       D.EVENT,
       D.P1TEXT,
       D.P1,
       D.P2TEXT,
       D.P2,
       CHR(BITAND(P1, -16777216) / 16777215) ||CHR(BITAND(P1, 16711680) / 65535) "Lock",
       BITAND(P1, 65535) "Mode",
       D.BLOCKING_SESSION,
       D.BLOCKING_SESSION_STATUS,
       D.BLOCKING_SESSION_SERIAL#,
       D.SQL_ID,
       TO_CHAR(D.SAMPLE_TIME, 'YYYYMMDDHH24MISS') SAMPLE_TIME
  FROM DBA_HIST_ACTIVE_SESS_HISTORY D
 WHERE D.SAMPLE_TIME >= TO_DATE('2016-05-10 17:30:00', 'YYYY-MM-DD HH24:MI:SS')
   AND D.SAMPLE_TIME <= TO_DATE('2016-05-10 19:30:00', 'YYYY-MM-DD HH24:MI:SS')
   AND D.EVENT = 'enq: TX - row lock contention';

& 说明:

有关一些具体的分析过程可以参考我的BLOG案例:http://blog.itpub.net/26736162/viewspace-2123996/

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档