-- blockers chain
WITH selector AS
(SELECT
'enq: TX - row lock contention' AS event,
'0kv66x9ahwcs6' AS sql_id FROM DUAL),
long_enq_tx AS
(SELECT DISTINCT sample_id, session_id, session_serial#
FROM v$active_session_history h
WHERE (event, sql_id) IN (SELECT event, sql_id FROM selector)
AND LEVEL > 3
CONNECT BY PRIOR session_id = session_id
AND PRIOR session_serial# = session_serial#
AND PRIOR sample_id + 1 = sample_id
AND PRIOR current_obj# = current_obj#
AND PRIOR current_file# = current_file#
AND PRIOR current_block# = current_block#
AND PRIOR current_row# = current_row#
START WITH (event, sql_id) IN (SELECT event, sql_id FROM selector))
SELECT MAX(sample_time),
path,
chain,
lvl,
victim,
session_id AS evil_blocker,
event,
h.sql_id,
txt,
program,
action,
session_serial#,
blocking_session_status,
COUNT(*),
MAX(time_waited) "blockers_waiting_time",
SUM(delta_time),
SUM(tm_delta_cpu_time),
SUM(tm_delta_db_time)
FROM (SELECT sys_connect_by_path(session_id, '/') path, sys_connect_by_path(event, '/') chain, LEVEL lvl, connect_by_root(session_id) victim, s.*
FROM v$active_session_history s
WHERE connect_by_isleaf = 1
AND blocking_session IS NULL
CONNECT BY PRIOR blocking_session = session_id
AND PRIOR blocking_session_serial# = session_serial#
AND PRIOR sample_id = sample_id
START WITH blocking_session IS NOT NULL
AND (sample_id, session_id, session_serial#) IN (SELECT * FROM long_enq_tx)
ORDER SIBLINGS BY session_id) h
LEFT OUTER JOIN (SELECT sql_id, TO_CHAR(SUBSTR(sql_text, 1, 1000)) txt FROM dba_hist_sqltext) t ON t.sql_id =
h.sql_id
GROUP BY path,
chain,
lvl,
victim,
session_id,
session_serial#,
event,
h.sql_id,
txt,
program,
action,
blocking_session_status
ORDER BY lvl DESC, victim;
WITH selector AS
(SELECT
'enq: TX - row lock contention' AS event,
'0kv66x9ahwcs6' AS sql_id FROM DUAL),
long_enq_tx AS
(SELECT DISTINCT sample_id, session_id, session_serial#
FROM v$active_session_history h
WHERE (event, sql_id) IN (SELECT event, sql_id FROM selector)
AND LEVEL > 3
CONNECT BY PRIOR session_id = session_id
AND PRIOR session_serial# = session_serial#
AND PRIOR sample_id + 1 = sample_id
AND PRIOR current_obj# = current_obj#
AND PRIOR current_file# = current_file#
AND PRIOR current_block# = current_block#
AND PRIOR current_row# = current_row#
START WITH (event, sql_id) IN (SELECT event, sql_id FROM selector))
SELECT MAX(sample_time),
path,
chain,
lvl,
victim,
session_id AS evil_blocker,
event,
h.sql_id,
txt,
program,
action,
session_serial#,
blocking_session_status,
COUNT(*),
MAX(time_waited) "blockers_waiting_time",
SUM(delta_time),
SUM(tm_delta_cpu_time),
SUM(tm_delta_db_time)
FROM (SELECT sys_connect_by_path(session_id, '/') path, sys_connect_by_path(event, '/') chain, LEVEL lvl, connect_by_root(session_id) victim, s.*
FROM v$active_session_history s
WHERE connect_by_isleaf = 1
AND blocking_session IS NULL
CONNECT BY PRIOR blocking_session = session_id
AND PRIOR blocking_session_serial# = session_serial#
AND PRIOR sample_id = sample_id
START WITH blocking_session IS NOT NULL
AND (sample_id, session_id, session_serial#) IN (SELECT * FROM long_enq_tx)
ORDER SIBLINGS BY session_id) h
LEFT OUTER JOIN (SELECT sql_id, TO_CHAR(SUBSTR(sql_text, 1, 1000)) txt FROM dba_hist_sqltext) t ON t.sql_id =
h.sql_id
GROUP BY path,
chain,
lvl,
victim,
session_id,
session_serial#,
event,
h.sql_id,
txt,
program,
action,
blocking_session_status
ORDER BY lvl DESC, victim;
