roselan lair

Friday, May 23, 2014

-- 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;