четверг, 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(60type c,

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

controlst_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 FOR
        SELECT to_charsid sid
              ,to_chardecode(
                      target_desc
                      ,NULL
                      ,decode(target,NULL,opnameconcat(opnameconcat (' - ',target)))
                      ,decode(target,NULL,concat(opnameconcat (' : ',target_desc))
                      ,concat(opnameconcat (' : ',concat(target_desc,concat (' - ',target)))))action
               ,to_charsofar sofar
               ,to_chartotalwork totalwork
               ,to_charround(sofar*100/totalwork,2percent
               ,to_charunits 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 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.


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




Результат:






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

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