v $ session_longops Поле TIMESTAMP и процессы синхронизации в миллисекундах - PullRequest
1 голос
/ 29 апреля 2011

Кто-нибудь знает, что делает поле TIMESTAMP в v$session_longops? Описание на странице документации просто говорит "отметка времени".

Мне нужно получить истекшее время некоторых операций, которые я отслеживаю в longops, и для short тестов они часто меньше 1 секунды, но я все еще хочу знать, какие из них выполняются дольше. Я надеялся использовать это поле TIMESTAMP для захвата миллисекундного времени, но я не могу выяснить, можно ли вообще использовать поле TIMESTAMP для этого.

Если это не удастся, есть ли другой способ получить длительность этих процессов в миллисекундах в longops?

UPDATE:

Проведя дополнительное исследование, поле TIMESTAMP, похоже, всегда имеет значение NULL. Кроме того, это тип данных DATE, а не TIMESTAMP ...

(с использованием Oracle 10g)

Ответы [ 4 ]

1 голос
/ 29 апреля 2011

Oracle поддерживает V$SESSION_LONGOPS - вы можете использовать DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS, чтобы помещать туда записи и обновлять их, но Oracle контролирует, как они удаляются.

Удивительно, почему вы не создаете собственную таблицухранить время для всех ваших тестов, чтобы вы могли анализировать все данные на досуге?Похоже, вы указываете, что у вас есть пакеты, содержащие ваши тесты;добавление в эти пакеты операторов INSERT или UPDATE кажется довольно нулевой суммой по сравнению с вызовами DBMS_APPLICATION_INFO.

V$SESSION_LONGOPS предшествует поддержке Oracle типа данных TIMESTAMP, поэтому столбец представляет собой DATE.

0 голосов
/ 05 мая 2011

Фактическое решение в итоге выглядело так:

io_start := systimestamp;
/*do some work*/
io_end := systimestamp;
dbms_application_info.set_session_longops(rindex => io_rindex, slno => io_slno, target => 0,
                      context => extract(second from (io_end-io_start)), --for very short jobs, store the millisecond time difference in the Context field.
                      op_name => in_op_name, sofar => 1, totalwork => 1,
                      units => 'blocks', target_desc => 'block job');

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

0 голосов
/ 29 апреля 2011

Может быть, вы можете использовать SELECT dbms_utility.get_time FROM dual;?Он возвращает время в сотнях секунд, а вычисление истекшего времени выполняется простым вычитанием.

0 голосов
/ 29 апреля 2011

вы можете получить миллисекунды следующим образом:

SYS@PRJ_SCOTTY1-VM> select to_char(SYSTIMESTAMP, 'hh24:mi:ss:ff3') from dual;

TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS:FF3')
------------------------------------------------------
16:06:10:944

SYS@PRJ_SCOTTY1-VM> select to_char(SYSTIMESTAMP, 'hh24:mi:ss:ff3') from dual;

TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS:FF3')
------------------------------------------------------
16:06:12:241

SYS@PRJ_SCOTTY1-VM>

, если вам нужно числовое представление объекта INTERVAL, вы можете использовать эти функции:

  /*
  ** **************************************************************************
  */
  Function daysBetween
   (ts1 timestamp with time zone,
    ts2 timestamp with time zone,
    numDec number default 0
   )
  Return Number is
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1;
  Begin
    return round(
      +      extract( day    from i )
      +      extract( hour   from i )/60
      +      extract( minute from i )/60/60
      +      extract( second from i )/60/60/60
    , numDec);
  End;

  /*
  ** **************************************************************************
  */
  Function hoursBetween
   (ts1 timestamp with time zone,
    ts2 timestamp with time zone,
    numDec number default 0
   )
  Return Number is
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1;
  Begin
    return round(
      +      extract( day    from i )*24
      +      extract( hour   from i )
      +      extract( minute from i )/60
      +      extract( second from i )/60/60
    , numDec);
  End;

  /*
  ** **************************************************************************
  */
  Function minutesBetween
   (ts1 timestamp with time zone,
    ts2 timestamp with time zone,
    numDec number default 0
   )
  Return Number is
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1;
  Begin
    return round(
      +      extract( day    from i )*24*60
      +      extract( hour   from i )*60
      +      extract( minute from i )
      +      extract( second from i )/60
    , numDec);
  End;


  /*
  ** **************************************************************************
  */
  Function secondsBetween
   (ts1 timestamp with time zone,
    ts2 timestamp with time zone,
    numDec number default 0
   )
  Return Number is
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1;
  Begin
    return round(
      +     extract( day    from i )*24*60*60
      +     extract( hour   from i )*60*60
      +     extract( minute from i )*60
      +     extract( second from i )
    , numDec);
  End;


  /*
  ** **************************************************************************
  */
  Function msecBetween
   (ts1 timestamp with time zone,
    ts2 timestamp with time zone,
    numDec number default 0
   )
  Return Number is
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1;
  Begin
    return round (
      +     extract( day    from i )*24*60*60*1000
      +     extract( hour   from i )*60*60*1000
      +     extract( minute from i )*60*1000
      +     extract( second from i )*1000
    , numDec);
  End;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...