DM-定位慢SQL

通过系统视图定位慢SQL

DM 数据库提供系统动态视图,可自动记录执行时间超过设定阈值的 SQL 语句。

配置方式

当 INI 参数 ENABLE_MONITOR=1、MONITOR_TIME=1 打开时,显示系统最近 1000 条执行时间超过预定值的 SQL 语句。默认预定值为 1000 毫秒。可通过 SP_SET_LONG_TIME 系统函数修改,通过 SF_GET_LONG_TIME 系统函数查看当前值。

修改配置

-- 两个参数均为动态参数,可直接调用系统函数进行修改
SP_SET_PARA_VALUE(1,'ENABLE_MONITOR',1);
SP_SET_PARA_VALUE(1,'MONITOR_TIME',1);

-- 记录执行时间超过2000 毫秒的SQL
SP_SET_LONG_TIME(2000);

查看配置

select SF_GET_LONG_TIME();

查看慢SQL

V$LONG_EXEC_SQLS 视图

超过执行时间阈值的 SQL 语句记录在 V$LONG_EXEC_SQLS 系统视图中

SELECT * FROM V$LONG_EXEC_SQLS;
V$LONG_EXEC_SQLS 字段说明
列名 说明
SESS_ID 会话 ID,会话唯一标识
SQL_ID 语句 ID,语句唯一标识
SQL_TEXT SQL 文本
EXEC_TIME 执行时间(毫秒)
FINISH_TIME 执行结束时间
N_RUNS 执行次数
SEQNO 编号
TRX_ID 事务号

查询活动会话数

SELECT COUNT(*) FROM V$SESSIONS WHERE STATE='ACTIVE';

获取已执行超过 2 秒的活动 SQL

SELECT* FROM (
SELECT SESS_ID,SQL_TEXT,DATEDIFF(SS,LAST_RECV_TIME,SYSDATE) Y_EXETIME,
       SF_GET_SESSION_SQL(SESS_ID) FULLSQL,CLNT_IP
FROM V$SESSIONS WHERE STATE='ACTIVE')
WHERE Y_EXETIME>=2;

阻塞查询

WITH LOCKS
     AS (SELECT O.NAME,L.*,S.SESS_ID,S.SQL_TEXT,S.CLNT_IP,S.LAST_SEND_TIME
           FROM V$LOCK L, SYSOBJECTS O, V$SESSIONS S
          WHERE L.TABLE_ID = O.ID AND L.TRX_ID = S.TRX_ID),
     LOCK_TR
     AS (SELECT TRX_ID WT_TRXID, TID BLK_TRXID
           FROM LOCKS
          WHERE BLOCKED = 1),
     RES
     AS (SELECT SYSDATE STATTIME,T1.NAME,T1.SESS_ID WT_SESSID,S.WT_TRXID,
                T2.SESS_ID BLK_SESSID,S.BLK_TRXID,T2.CLNT_IP,
                SF_GET_SESSION_SQL (T1.SESS_ID) FULSQL,
                DATEDIFF (SS, T1.LAST_SEND_TIME, SYSDATE) SS,
                T1.SQL_TEXT WT_SQL
           FROM LOCK_TR S, LOCKS T1, LOCKS T2
          WHERE     T1.LTYPE = 'OBJECT'
                AND T1.TABLE_ID <> 0
                AND T2.LTYPE = 'OBJECT'
                AND T2.TABLE_ID <> 0
                AND S.WT_TRXID = T1.TRX_ID
                AND S.BLK_TRXID = T2.TRX_ID)
SELECT DISTINCT WT_SQL,CLNT_IP,SS,WT_TRXID,BLK_TRXID
  FROM RES;

查询等待事务

-- 1. 确认语句处于活动状态
SELECT * FROM v$sessions WHERE state='ACTIVE'
AND dbms_lob.substr(sf_get_session_sql(sess_id)) LIKE '%语句片段%'

-- 2. 
SELECT * FROM v$trxwait WHERE id = <上述语句得到结果得 TRX_ID>

V$TRXWAIT 查询得到结果的 WAIT_FOR_ID 字段标记的事务即为当前语句正在等待的事务

通过开始SQL跟踪日志定位慢查询

详见"实施-> 7-DM 开启SQL日志跟踪分析.md"

posted @ 2021-11-10 22:49  KuBee  阅读(481)  评论(0编辑  收藏  举报