четверг, 23 октября 2014 г.

Оценка долгоработающих отчетов

Иногда возникает потребность срубить долгий отчет из sm50, но на сколько он выполнился не понятно.

Коллеги подогнали select, по SID понять что же он делает и сколько ему осталось:
SELECT sid
      ,decode(
                    target_desc
                    ,NULL
                    ,decode(target,NULL,opname, concat(opname, concat (
' - ',target)))
                    ,decode(target,NULL,concat(opname, concat (
' : ',target_desc))
                    ,concat(opname, concat (
' : ',concat(target_desc,concat (' - ',target)))))) action
             ,sofar
             ,totalwork
             ,round(sofar*
100/totalwork,2) percent
             ,units
             ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (elapsed_seconds,
'second'),'hh24:mi:ss') elapsed_time
             ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (time_remaining,
'second'),'hh24:mi:ss') time_remaining
FROM v$session_longops
WHERE sofar < totalwork and totalwork<>
0;


(п.с.: Ещё вариант через вьюху - RSDDSTAT_OLAP.
Историю времени запросов можно посмотреть следующим образом:
- вьюха RSDDSTAT_OLAP
- CALDAY = дата запуска запроса
- INFOPROV = инфо-провайдер
- OBJNAME = тех. Имя запроса
- EVENTID установить 3100 (к примеру)

Получаем RUNTIME – это полное время выполнения отчета с учетом времени ожидания ввода пользователем данных на селекционном экране.)
Прикрутил обёртку на ABAP:
*&---------------------------------------------------------------------*
*& Report  ZN_PROCESS_ANALISIS
*&
*&---------------------------------------------------------------------*
*& Иногда возникает потребность срубить долгий отчет из sm50,
*& но на сколько он выполнился не понятно.
*&
*& Для этого можно использовать запрос,
*& и по SID понять что же он делает и сколько ему осталось.
*&---------------------------------------------------------------------*
report zn_process_analisis.
types:
    begin of ls_atable,
      sid(60)             type c,
      action(60)          type c,
      sofar(60)           type c,
      totalwork(60)       type c,
      percent(60)         type c,
      units(60)           type c,
      elapsed_time(60)    type c,
      time_remaning(60)   type c,
      end of ls_atable.
data:
      l_sid(60)           type c,
      l_action(60)        type c,
      l_sofar(60)         type c,
      l_totalwork(60)     type c,
      l_percent(60)       type c,
      l_units(60)         type c,
      l_elapsed_time(60)  type c,
      l_time_remaning(60) type c,

      lt_atable           type table of ls_atable,
      wa_atable           like line of lt_atable.

controls: t_pranal type tableview using screen 1000.
*-----------------------------------------------------------------------
call screen 1000.
*-----------------------------------------------------------------------
module status_1000 output.
  set pf-status 'ZNMENU'.
  case sy-ucomm.
*"  Выход из программы
    when 'EXIT' or 'BACK' or 'CANCEL'.
      leave program.
  endcase.
endmodule.                 " STATUS_1000  OUTPUT
*-----------------------------------------------------------------------
module t_pranal_change_tc_attr output.
  describe table lt_atable lines t_pranal-lines.
endmodule.                    "T_PRANAL_CHANGE_TC_ATTR OUTPUT
*-----------------------------------------------------------------------
module user_command_1000 input.
  case sy-ucomm.
    when 'REFRESH'.
      perform select.
  endcase.
endmodule.                 " USER_COMMAND_1000  INPUT
*-----------------------------------------------------------------------
module t_pranal_init output.
    perform select.
endmodule.                 " T_PRANAL_INIT  OUTPUT
*-----------------------------------------------------------------------
form select.
  EXEC SQL.
    OPEN C FOR
        SELECT to_char( sid ) sid
              ,to_char( decode(
                      target_desc
                      ,NULL
                      ,decode(target,NULL,opname, concat(opname, concat (' - ',target)))
                      ,decode(target,NULL,concat(opname, concat (' : ',target_desc))
                      ,concat(opname, concat (' : ',concat(target_desc,concat (' - ',target)))))) ) action
               ,to_char( sofar ) sofar
               ,to_char( totalwork ) totalwork
               ,to_char( round(sofar*100/totalwork,2) ) percent
               ,to_char( units ) units
               ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (elapsed_seconds, 'second'),'hh24:mi:ss') elapsed_time
               ,TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (time_remaining, 'second'),'hh24:mi:ss') time_remaining
           FROM v$session_longops
          WHERE sofar < totalwork and totalwork<>0

  ENDEXEC.

  do.
    EXEC SQL.
      FETCH NEXT C INTO
               :l_sid,
               :l_action,
               :l_sofar,
               :l_totalwork,
               :l_percent,
               :l_units,
               :l_elapsed_time,
               :l_time_remaning
    ENDEXEC.

    if sy-subrc <> 0.
      exit.
    else.
      condense l_sid no-gaps.
      wa_atable-sid           = l_sid.
      wa_atable-action        = l_action.
      wa_atable-sofar         = l_sofar.
      wa_atable-totalwork     = l_totalwork.
      wa_atable-percent       = l_percent.
      wa_atable-units         = l_units.
      wa_atable-elapsed_time  = l_elapsed_time.
      wa_atable-time_remaning = l_time_remaning.

      append wa_atable to lt_atable.
    endif.
  enddo.

  EXEC SQL.
    CLOSE C
  ENDEXEC.
endform.                    " SELECT
*-----------------------------------------------------------------------



SCREEN:
process before output.

  module t_pranal_init.

  loop at   lt_atable
       into wa_atable
       with control t_pranal
       cursor t_pranal-current_line.
  endloop.

  module status_1000.

process after input.

  loop at lt_atable.
    chain.
      field wa_atable-sid.
      field wa_atable-action.
      field wa_atable-sofar.
      field wa_atable-totalwork.
      field wa_atable-percent.
      field wa_atable-units.
      field wa_atable-elapsed_time.
      field wa_atable-time_remaning.
    endchain.
  endloop.

  module user_command_1000.


Таблицу нам вставит Волшебник:




Результат:






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

Отправить комментарий