Blame

2ca6ef feagor 2025-12-02 11:45:53 1
### ASH. Получаем дерево блокировок сессий в рамках одного сэмпла
2
Порой необходимо найти кто именно был инициатором блокировок на инстанции в прошлом.
3
4
Так как поля Final blocking session в ASH отчете нет. То действуем следующим образом. Берем инетересующий нас промежуток и событие
61b790 feagor 2025-12-05 15:24:34 5
```oraclesql=
2ca6ef feagor 2025-12-02 11:45:53 6
SELECT sample_id,event,count(1)
7
FROM dba_hist_active_sess_history ash
8
where ash.BLOCKING_SESSION is not null
9
and event = 'enq: TX - row lock contention'
70b025 feagor 2025-12-02 11:46:19 10
and ash.SAMPLE_TIME between to_date('10.08.2018 12:20:00','dd.mm.yyyy hh24:mi:ss')
11
and to_date('10.08.2018 12:30:00','dd.mm.yyyy hh24:mi:ss')
2ca6ef feagor 2025-12-02 11:45:53 12
group by sample_id,event
13
order by 3 desc;
14
```
15
и по нужному sample_id строим дерево блокировок, выбрасывая все, что не причастно к блокировкам
16
```sql
17
with s as (
18
SELECT /*+materialize*/* FROM dba_hist_active_sess_history t
19
where sample_id = 272753416
20
)
21
SELECT sample_id,snap_id,level,s.SESSION_ID,sql_id,s.BLOCKING_SESSION,event,CONNECT_BY_ISLEAF is_leaf
22
FROM s
23
where not (CONNECT_BY_ISLEAF = 1 and level = 1)
24
CONNECT BY PRIOR s.SESSION_ID = s.BLOCKING_SESSION
25
START WITH s.blocking_session IS null;
26
```
27
По дереву находим блокера, после чего по сиду сблокера и сэмплу ищем верхнеуровневый запрос
28
```sql
29
SELECT s.* FROM dba_hist_active_sess_history t left join v$sql s on s.sql_id = t.top_level_sql_id
30
where sample_id = 272753416 and session_id = 2650;
31
```
412967 feagor 2025-12-02 12:17:53 32
В результат находим виновника