четверг, 29 мая 2014 г.

Использование типа Object

Пример организации циклического буфера FIFO

Создаем глобальный тип массива на 100 элементов

CREATE type t_last_sess_arr is varray(100) of number(32,0);

Создаем объектный тип с полями текущей позиции массива и самим массивом.
В объекте 3 метода

  1. конструктор, инициализирующий массив пустыми значениями 
  2. процедура которая сдвигает позицию и заменяет элемент массива в этой позиции
  3. функция, которая возвращает объект с обновленным элементом и сдвинутой позицией
CREATE OR REPLACE
TYPE t_last_sess   AS OBJECT (
         position       INT
        , last_sess    t_last_sess_arr
        , CONSTRUCTOR FUNCTION t_last_sess
                RETURN SELF AS RESULT
        , MEMBER PROCEDURE addBS (b_session_id NUMBER)
        , MEMBER FUNCTION updArr (b_session_id NUMBER) RETURN t_last_sess
   );
/

CREATE OR REPLACE
TYPE BODY t_last_sess AS
  CONSTRUCTOR FUNCTION t_last_sess
    RETURN SELF AS RESULT
  AS
  BEGIN
    SELF.position := 1;
    SELF.last_sess := t_last_sess_arr();
    SELF.last_sess.EXTEND(100);
    RETURN;
  END t_last_sess;
  MEMBER PROCEDURE addBS (b_session_id NUMBER)
  IS
  BEGIN
    SELF.last_sess(SELF.position) := b_session_id;
    IF SELF.position = 100 THEN
        SELF.position := 1;
    ELSE
        SELF.position := SELF.position +1;
    END IF;
    RETURN;
  END addBS;
  MEMBER FUNCTION updArr (b_session_id NUMBER) RETURN t_last_sess
  IS
    l_arr t_last_sess;
  BEGIN
    l_arr:= SELF;
    l_arr.addBS(b_session_id);
    RETURN l_arr;
  END updArr;
END;
/



Пример использования данного объектного типа

Буфер для сохранения последних 100 сессий по каждому отдельному типу
create table last_sessions (
type_id int primary key,
sess_arr t_last_sess)
organization index;

Инициализация буфера для типа сессий=1
INSERT INTO last_sessions VALUES(1, t_last_sess());

Обновление буфера
update last_sessions t set t.sess_arr=t.sess_arr.updArr(<ИД сессии>) where bill_type_id=1;

среда, 14 мая 2014 г.

Трассировка shared сессий

Определяем сессию для трассировки - SID, SERIAL# и инстанс в случае RAC

Трассировка по шаредам складывается в трейс файлы диспетчеров  и шаред серверов
Чтобы не собирать старую историю можно удалить(перенести) все трейс файлы из USER_DUMP_DEST

Включаем трассировку
exec dbms_monitor.SESSION_TRACE_ENABLE(SID, SERIAL#, TRUE, TRUE);

Выключаем трассировку
exec dbms_monitor.SESSION_TRACE_DISABLE(SID);

собираем данные из кучи файлов
trcsess output=trace.log session=SID.SERIAL# *

прогоняем tkprof
tkprof trace.log

Изучаем и анализируем результат