监控阻塞 SQL 并分析问题的工作流程 - 案例
监控阻塞 SQL 并分析问题的工作流程 - 案例
查看阻塞 SQL
/* Formatted on 2021/9/15 17:19:32 (QP5 v5.365) */
SELECT /*+no_unnest*/
'alter system kill session '''
|| s.sid
|| ','
|| s.SERIAL#
|| ''' immediate;',
p.SPID,
q.ROWS_PROCESSED,
s.USERNAME,
s.EVENT,
s.LAST_CALL_ET,
s.LOCKWAIT,
s.STATUS,
q.SQL_FULLTEXT,
q.SQL_ID,
s.sid,
s.BLOCKING_SESSION
FROM v$session s, v$sql q, v$process p
WHERE s.sid > 1
AND s.PADDR = p.ADDR
AND q.sql_id(+) = s.sql_id
AND s.username IS NOT NULL
AND s.status = 'ACTIVE'
AND s.event NOT LIKE '%SQL*Net message from client%'
AND last_call_et > 1
ORDER BY last_call_et DESC, sid
该 SQL 显示的是当前正在执行的 SQL 语句,
如果 BLOCKING_SESSION 有值, 说明有锁的等待,
图中所示为: 1485 等待 1356 的执行;
1356 是 ORDER 同步的接口, 1485 是生产相关操作,
这也反映了现场生产报工业务受到接口影响的实际情况。
找到可疑 SQL 及 SQL_ID
- 可以根据上述步骤中的 SQL_ID 作为分析的依据。
- 通过 MES 系统中代码的录制功能,找到具体的 SQL 语句。
- 执行一遍 SQL。
select * from v$sqlarea where sql_text like '%sap_mes_bom%' ;
找到刚执行的 SQL 的 SQL_ID
可以使用 like 进行查找,
有时可能不太好找, 可以在 SQL 中加入特殊注释,like 中根据注释内容查找.
假设 SQL_ID 为 “fpqaxgjy9yypn”
分析执行计划
通过如下语句获取执行计划
select * from table (dbms_xplan.display_cursor( 'fpqaxgjy9yypn' , null , 'allstats last' ));
如图,执行计划中重点关注
TABLE ACCESS FULL,
如图,*6,使用的条件是 PROCESSING_GID。 但是没有用到索引, 有问题,需要处理。
采取相应措施
分析执行计划,
具体如何分析,比较复杂,单独介绍。
一般需要采取的措施:
1. 缺索引
2. 统计信息不对
3. 索引失效
4. 分区表, 分区索引问题