27 нояб. 2012 г.

Анализ блокировок Oracle

Продолжая серию шпаргалок по Oracle - сегодня речь пойдет о блокировках.

Вариантов, когда образуется толпа ждущих сессий, может быть масса, и у каждого DBA есть свой набор разнообразных селектов для вычисления "вредных" транзакций.
Вскрываю свою копилку:

Вариант 1

SELECT
    h.sid as Holder,
    w.sid as Waiter,
    h.id1, h.id2, h.lmode, h.request, h.type, h.ctime, w.ctime as wtime
FROM V$LOCK h, V$LOCK w
WHERE (h.id1, h.id2, h.type) IN ((w.id1, w.id2, w.type))
AND h.request=0
AND w.request>0


Вариант 2 (oracle 10g and higher)

with
b as (
        select vb.sid, vb.blocking_session
        from v$session vb
        where vb.blocking_session is not null
    ),
s as
(
        select vs.sid
        from v$session vs
        where vs.sid in (select b.blocking_session from b )
)
select
    v.blocking_session,v.sid,v.serial#,v.osuser,
    v.username,v.status,v.machine,
    v.program,v.module,v.action,
    v.blocking_session_status,v.blocking_instance,v.event,v.state,v.saddr,
    v.sql_id,v.sql_hash_value,v.prev_sql_id,v.prev_hash_value,
    v.ROW_WAIT_OBJ#,v.ROW_WAIT_BLOCK#,v.ROW_WAIT_ROW#,v.ROW_WAIT_FILE#
from
    v$session v
where
    (v.sid in (select sid from b)
        or v.sid in (select sid from s)
    )
order by 1 nulls last

Можно еще использовать представление DBA_BLOCKERS.

via

Комментариев нет: