文章摘要
这篇文章讨论了通过自定义视图和查询来分析SQL阻塞问题。首先,作者展示了两个自定义视图,分别统计了全局和非全局的阻塞情况,帮助识别阻塞者和被阻塞者的活动。接着,作者进一步细化查询,加入了等待事件的分析,以更清晰地发现阻塞原因。最后,文章得出了结论,指出在特定时间段内,某个SQL语句出现了大量并发等待和阻塞现象,最终发现是由于某个操作的阻塞导致的。
a.应用场景:开发反应2023-03-02 00:22至00:35,数据落盘慢,根据情况查看此时间段的主要活动事件,数量,与sql_id(全局)
select count(*), sql_id, event, blocking_session
from gv$active_session_history
where sample_time between
to_date(‘2023-03-02 00:22:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:35:00’, ‘yyyy-mm-dd hh24:mi:ss’)
group by sql_id, event, blocking_session
order by 1;
(非全局)BLOCKING_INST_ID–被阻塞者, blocking_session–阻塞者
select count(*), sql_id, event, BLOCKING_INST_ID, blocking_session
from v$active_session_history
where sample_time between
to_date(‘2023-03-02 00:20:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:35:00’, ‘yyyy-mm-dd hh24:mi:ss’)
group by sql_id, event, BLOCKING_INST_ID, blocking_session
order by 1;
b.现在我们已经得到两个关键信息:sql_id与阻塞事件,首先根据sql_id我们可以再进一步使用此视图,实际中可以多调整几个较小的时间段,以突出最有代表的信息
select count(*),
session_id,
session_serial#,
sql_id,
event,
BLOCKING_INST_ID,
blocking_session
from v$active_session_history
where sample_time between
to_date(‘2023-03-02 00:24:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:25:00’, ‘yyyy-mm-dd hh24:mi:ss’)
and sql_id=’1xfbtdvu3xb67′
group by session_id,
session_serial#,
sql_id,
event,
BLOCKING_INST_ID,
blocking_session
order by 3;
c.加入等待事件后更清晰
select count(*),
session_id,
sql_id,
event,
BLOCKING_INST_ID,
blocking_session
from v$active_session_history
where sample_time between
to_date(‘2023-03-02 00:25:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:35:00’, ‘yyyy-mm-dd hh24:mi:ss’)
and event=’library cache lock’
and sql_id=’1j47z0mc6k02b’
group by session_id, sql_id, event, BLOCKING_INST_ID, blocking_session
order by 1;
结论:可以看出大量并发等待,最终是发现有什么阻塞了此SQL语句
select count(*), sql_id, event, blocking_session
from gv$active_session_history
where sample_time between
to_date(‘2023-03-02 00:22:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:35:00’, ‘yyyy-mm-dd hh24:mi:ss’)
group by sql_id, event, blocking_session
order by 1;
(非全局)BLOCKING_INST_ID–被阻塞者, blocking_session–阻塞者
select count(*), sql_id, event, BLOCKING_INST_ID, blocking_session
from v$active_session_history
where sample_time between
to_date(‘2023-03-02 00:20:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:35:00’, ‘yyyy-mm-dd hh24:mi:ss’)
group by sql_id, event, BLOCKING_INST_ID, blocking_session
order by 1;
b.现在我们已经得到两个关键信息:sql_id与阻塞事件,首先根据sql_id我们可以再进一步使用此视图,实际中可以多调整几个较小的时间段,以突出最有代表的信息
select count(*),
session_id,
session_serial#,
sql_id,
event,
BLOCKING_INST_ID,
blocking_session
from v$active_session_history
where sample_time between
to_date(‘2023-03-02 00:24:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:25:00’, ‘yyyy-mm-dd hh24:mi:ss’)
and sql_id=’1xfbtdvu3xb67′
group by session_id,
session_serial#,
sql_id,
event,
BLOCKING_INST_ID,
blocking_session
order by 3;
c.加入等待事件后更清晰
select count(*),
session_id,
sql_id,
event,
BLOCKING_INST_ID,
blocking_session
from v$active_session_history
where sample_time between
to_date(‘2023-03-02 00:25:00’, ‘yyyy-mm-dd hh24:mi:ss’) and
to_date(‘2023-03-02 00:35:00’, ‘yyyy-mm-dd hh24:mi:ss’)
and event=’library cache lock’
and sql_id=’1j47z0mc6k02b’
group by session_id, sql_id, event, BLOCKING_INST_ID, blocking_session
order by 1;
结论:可以看出大量并发等待,最终是发现有什么阻塞了此SQL语句
© 版权声明
文章版权归作者所有,未经允许请勿转载。