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 | В результат находим виновника |