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

14 нояб. 2012 г.

Текст запроса в oracle 9i

Задачка - зная hash_value либо address вытащить полный текст запроса.
Дело в том что в oracle 9 еще нет поля sql_fulltext в v$sqlarea, иначе и проблемы собственно не было бы.
Поэтому будем использовать вьюху v$sqltext_with_newlines:

SELECT
  v.hash_value, v.address
  , dbms_xmlgen.convert(
                    XMLAGG(
                           XMLELEMENT("node",replace(v.sql_text,chr(0))) order by piece
                          ).extract('//text()').getCLOBVal()
                     ,1) sql_fulltext
 FROM v$sqltext_with_newlines v, v$sql s
WHERE 1=1
  AND v.hash_value = '1700192551'
  --AND v.address = '07000000152A3968'
  AND v.hash_value = s.hash_value
GROUP BY v.hash_value, v.address, s.sql_text

Oracle. Список значений контекста сессии

Иногда возникает задача получения значений всех переменных контекста - например, если имя переменной заранее не известно.

Путем беглого гугления был обнаружен и допилен небольшой скрипт:


DECLARE
   t_list DBMS_SESSION.AppCtxTabTyp;
   l_size NUMBER;
   i PLS_INTEGER;
BEGIN
   DBMS_SESSION.List_Context (t_list, l_size);
   i := t_list.FIRST; 
   LOOP
      EXIT WHEN i IS NULL;
          DBMS_OUTPUT.Put_Line (
             t_list(i).namespace || '.' ||
             t_list(i).attribute || ' = ' ||
             t_list(i).value);
      i := t_list.NEXT(i);
   END LOOP; 
   DBMS_OUTPUT.Put_Line('DBMS_SESSION.List_Context COUNT = '||l_size);
END;
/