Текущее время: Сб, июл 19 2025, 01:00

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Чт, фев 20 2014, 22:39 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
ну вот добрался до дому и могу нормально писать. по поводу ФМ /GESGTS/RSTABLESIZE_NEW это действительно местная разработка, только я его маленько изменил для собственных нужд. Исходный код попробую завтра выложить. Теперь о моем промежуточном решении проблемы. Решил все реализовать с использованием 2 таблиц БД. Одна для хранения статуса процессов (10 строк на максимальное количество процессов Имя процесса + статус) Вторая для сохранения результатов. Один репорт инициирует параллельные процесы и передает их в ФМ. Активные процессы отмечаются в таблице БД. ФМ производит вычисления и отмечает завершенный процесс как неактивный. Второй репорт ждет окончания всех активных процессов, т.е. пока все процессы в БД не будут отмечены как неактивные, после этого поризводит подсчет пространства из второй таблицы, куда ФМ сохраняет результыты. В качестве Полей второй таблицы используется номер клиента, номер процесса и размер.Клиент и номер процесса выступают в качестве ключа. Завтра буду тестировать, главное чтобы параллельные процессынебыли диалоговыми.

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Чт, фев 20 2014, 22:48 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, авг 18 2010, 15:38
Сообщения: 97
massimots написал(а):
Диалоговый процесс висит на подсчете конкретной таблицы, а не группы таблиц.

если я вас правильно понял, то у вас минимальная единица работы параллельного процесса не влезает в диалоговый процесс. В этом случае вам параллелизация не поможет.
попробуйте посмотреть на bgRFC http://help.sap.com/saphelp_nw70/helpda ... ontent.htm
Если версия позволяет, это может быть простым решением вашей проблемы.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пт, фев 21 2014, 08:55 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Кодер написал(а):
По факту, очень интересует исходный код ФМ /GESGTS/RSTABLESIZE_NEW. Это ваш собственный? В нашей системе на MaxDB такого нет. Как я понимаю, он подсчитывает по каждому манданту кол-во записей и умножает на их размер? Данная операция, скорее всего не оптимальна с точки зрения производительности БД. Но это только предположения.


Добрый день!
Если это так, то может действительно не стоит пытаться рассчитать число записей в таблице через select count(*)?
Ведь DB20 как-то мгновенно показывает число записей в таблице, независимо от ее размера..

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пт, фев 21 2014, 09:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
LKU: дык у него ж задача посчитать размер таблы на каждый мандант( в пропорции от общего размер таблы,что,кстати, может быть полной фигней, т.к. не учитывает размер выделенного под таблу места, еще не занятого реальными записями). Не выйдет иначе-то... да и DB20 не совсем мгновенно показывает размеры. Размер таблы в записях извлекается с уровня самой субд(ну в том же оракле спец.вьюхи для получения инфы)

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пт, фев 21 2014, 09:18 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Спасибо, теперь постановку вопроса понял. Правда, не понял, зачем все это..

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пт, фев 21 2014, 13:35 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
vot cod FM

Code:
FUNCTION /gesgts/rstablesize_tab.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(IM_CLIENT_LOW) TYPE  T000-MANDT
*"     VALUE(IM_CLIENT_HI) TYPE  T000-MANDT
*"     VALUE(IM_NOCLASSL) TYPE  OAX
*"     VALUE(IM_NOCLASSA) TYPE  OAX
*"     VALUE(IM_TAB) TYPE  /GESGTS/TABNAME_T
*"     VALUE(IM_TASKNAME) TYPE  /GESGTS/SP_JOB-JOB_NAME
*"  EXCEPTIONS
*"      COMMUNICATIONS_FAILURE
*"      SYSTEM_FAILURE
*"----------------------------------------------------------------------


  DATA: sizetab          LIKE cctabsize OCCURS 0 WITH HEADER LINE,
        dd02l_tab        LIKE dd02l OCCURS 0 WITH HEADER LINE,
        t000_tab         LIKE t000-mandt OCCURS 0 WITH HEADER LINE,
        vrs_tab          LIKE vrstabc OCCURS 0 WITH HEADER LINE,
        repid            LIKE sy-repid,
        count            TYPE i,
        name(10)         TYPE c,
        ex_sumtab        TYPE /gesgts/sizetab_t,
        es_sumtab        TYPE /gesgts/sizetab,
        wa_output        LIKE /gesgts/sp_check,
        gt_output        LIKE TABLE OF wa_output.


  DATA: text(50),
        length           TYPE i,
        gs_tab           TYPE dd02l.

  DATA: i                TYPE i,
        tabname          TYPE tabname.
  DATA: s_layout         TYPE slis_layout_alv.
  DATA: bypass.

COMMIT WORK.

  name = im_taskname.

  LOOP AT im_tab INTO gs_tab.

    APPEND gs_tab TO dd02l_tab.

    CLEAR gs_tab.

  ENDLOOP.

  SELECT mandt FROM t000 INTO TABLE t000_tab WHERE mandt
        BETWEEN im_client_low  AND im_client_hi.
  IF sy-subrc <> 0.
    t000_tab = im_client_low.
    APPEND t000_tab.
  ENDIF.
  DELETE FROM euinfo WHERE object = 'TABL' AND obj_name = 'CCTABSIZE'.



  SELECT * FROM vrstabc INTO TABLE vrs_tab
                              WHERE tabmode = 'X'
                                AND maxrelease >= sy-saprl. "#EC PORTABLE
  SORT vrs_tab.

  SORT dd02l_tab.
*    DELETE ADJACENT DUPLICATES FROM dd02l_tab COMPARING tabname.

  LOOP AT dd02l_tab.
    IF dd02l_tab-contflag <> 'L' OR im_noclassl = ' '.
      IF dd02l_tab-contflag <> 'A' OR im_noclassa = ' '.
        CLEAR vrs_tab.
        READ TABLE vrs_tab WITH KEY tabname = dd02l_tab-tabname
                                    BINARY SEARCH.
        IF sy-subrc <> 0.
          sizetab-tabname  = dd02l_tab-tabname.
          sizetab-class    = dd02l_tab-tabclass.
          sizetab-contflag = dd02l_tab-contflag.
          IF sizetab-class = 'TABCLUST'.
            SELECT SINGLE devclass INTO sizetab-devclass FROM tadir
                             WHERE pgmid    = 'R3TR'        AND
                                   object   = 'SQLT'        AND
                                   obj_name = sizetab-tabname.
          ELSE.
            SELECT SINGLE devclass INTO sizetab-devclass FROM tadir
                             WHERE pgmid    = 'R3TR'        AND
                                   object   = 'TABL'        AND
                                   obj_name = sizetab-tabname.
          ENDIF.
          IF im_noclassl = 'X' AND sizetab-devclass(1) = '$'.
            CONTINUE.
          ENDIF.
          LOOP AT t000_tab.
            sizetab-mandt   = t000_tab.
            PERFORM get_table_size_tab USING sizetab.
            APPEND sizetab.
            count = count + 1.
            IF count = 100.
              CLEAR count.
              COMMIT WORK.
            ENDIF.
          ENDLOOP.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.





  DATA: gs_sumtab TYPE /gesgts/sizetab.

  LOOP AT sizetab.
    MOVE sizetab-mandt   TO gs_sumtab-mandt.
    MOVE sizetab-size_kb TO gs_sumtab-size.
    COLLECT gs_sumtab INTO ex_sumtab.
  ENDLOOP.
  SORT ex_sumtab BY size DESCENDING.

  CLEAR sizetab-size.

  LOOP AT ex_sumtab INTO es_sumtab.
    CLEAR wa_output.
    wa_output-job_name = name.
    wa_output-mandt = es_sumtab-mandt.
    wa_output-kb_size = es_sumtab-size.
    APPEND wa_output TO gt_output.
  ENDLOOP.


  INSERT /gesgts/sp_check FROM TABLE gt_output.

  UPDATE /gesgts/sp_job SET aktiv = ' '
  WHERE job_name EQ name.




ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  get_table_size
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SIZETAB  text
*----------------------------------------------------------------------*
FORM get_table_size_tab USING    p_sizetab STRUCTURE cctabsize.

  DATA: text(80),
        x030l_tab      LIKE x030l,
        nt_subrc       LIKE sy-subrc,
        subrc          LIKE sy-subrc,
        anzahl         TYPE i.
  DATA: BEGIN  OF dfies OCCURS 20.
          INCLUDE STRUCTURE dfies.
  DATA: END OF dfies.
  DATA: BEGIN  OF ctab OCCURS 20,
         line(72).
  DATA: END OF ctab.

  CALL FUNCTION 'SCCR_GET_NAMETAB_AND_TABLEN'
    EXPORTING
      tabname    = p_sizetab-tabname
    IMPORTING
      x030l      = x030l_tab
      tablen     = p_sizetab-tablen
    TABLES
      dfies      = dfies
    EXCEPTIONS
      ddic_error = 1
      OTHERS     = 2.
  nt_subrc = sy-subrc.
  IF x030l_tab-tabform CO 'PC'.
    CALL FUNCTION 'DB_EXISTS_TABLE'
      EXPORTING
        tabname = x030l_tab-refname
      IMPORTING
        subrc   = subrc.
  ELSE.
    CALL FUNCTION 'DB_EXISTS_TABLE'
      EXPORTING
        tabname = p_sizetab-tabname
      IMPORTING
        subrc   = subrc.
  ENDIF.

  IF subrc = 0 AND nt_subrc = 0.
    READ TABLE dfies INDEX 1.
    text = '& = ''&'' '.
    REPLACE '&' WITH dfies-fieldname INTO text.
    REPLACE '&' WITH p_sizetab-mandt INTO text.
    ctab-line = text.
    APPEND ctab.


    SELECT COUNT(*) INTO p_sizetab-nbrins FROM (p_sizetab-tabname)
                                 CLIENT SPECIFIED WHERE (ctab).
    COMMIT WORK.
  ENDIF.
  p_sizetab-size = p_sizetab-nbrins * p_sizetab-tablen.
  p_sizetab-size_kb = p_sizetab-size / 1024.
ENDFORM.                               " GET_p_sizetab-tabname_SIZE


kak vidno samoe dolgoe eto SELECT COUNT(*)

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пт, фев 21 2014, 13:38 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
vot moi ismenennyi kod, no FM vse ravno idet kek Dialog. Sprosil pro bgRFC skasali chto sami poka tekogo ne delali eshe. Budut dumat. Ishu alternativy dlya Select Count(*). Chto do realnogo razmera, to chtoby bylo tochnee zadaetsya parametr WORKBENCH Size

Code:
*&---------------------------------------------------------------------*
*& Report  /GESGTS/SPACECHECK_NEW
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT /gesgts/spacecheck_new_v2_0 MESSAGE-ID /gesgts/compliance.




DATA: s_mandt-high      TYPE t000-mandt,
      s_mandt-low       TYPE t000-mandt,
      dd02l_tab         LIKE dd02l OCCURS 0 WITH HEADER LINE,
      gs_tab            TYPE LINE OF /gesgts/tabname_t," /gesgts/tabname,
      gt_tab            TYPE /gesgts/tabname_t,
      gt_tab_q1         TYPE /gesgts/tabname_t,
      gt_tab_q2         TYPE /gesgts/tabname_t,
      gt_tab_q3         TYPE /gesgts/tabname_t,
      gt_tab_q4         TYPE /gesgts/tabname_t,
      gt_tab_q5         TYPE /gesgts/tabname_t,
      gt_tab_q6         TYPE /gesgts/tabname_t,
      gt_tab_q7         TYPE /gesgts/tabname_t,
      gt_tab_q8         TYPE /gesgts/tabname_t,
      gt_tab_q9         TYPE /gesgts/tabname_t,
      gt_tab_q0         TYPE /gesgts/tabname_t,
      gt_tab_q11         TYPE /gesgts/tabname_t,
      gv_lines          TYPE i,
      gv_start          TYPE sy-timlo,
      gv_end            TYPE sy-timlo.


DATA new_taskname TYPE /gesgts/sp_job-job_name.


TABLES: t000, dd02l, /gesgts/sp_job.

CONSTANTS:
    opcode_arfc_noreq TYPE x VALUE 10.

DATA:
   server       TYPE msname,
   reason       TYPE i,
   trace        TYPE i VALUE 0,
   dia_max      TYPE i,
   dia_free     TYPE i,
   taskid       TYPE i VALUE 0,
   taskname(20) TYPE c,
   servergroup  TYPE rzlli_apcl,
   it_wpliste   TYPE TABLE OF  WPINFO,
   wa_wpliste   LIKE wpinfo.





PARAMETERS: p_volume TYPE memoryused_long,
            p_clust    TYPE oax,
            p_nol    TYPE oax ,
            p_noa    TYPE oax,
            p_proz   TYPE i DEFAULT dia_max.



START-OF-SELECTION.



CALL FUNCTION 'TH_GET_WPINFO'
* EXPORTING
*   SRVNAME          =
*   WITH_CPU         =
  TABLES
    wplist           = it_wpliste
* EXCEPTIONS
*   SEND_ERROR       = 1
*   OTHERS           = 2
          .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.


data: max_batch TYPE i,
      free_batch TYPE i.


LOOP AT it_wpliste INTO wa_wpliste.

  IF  wa_wpliste-wp_typ EQ 'BTC' AND wa_wpliste-wp_status EQ 'wartet'.
    ADD 1 TO free_batch.
    ENDIF.



  ENDLOOP.

  SUBTRACT 1 FROM free_batch.

*Anzahl von verfugbaren freie Prozessen ermittlen
*
*  CALL 'ThSysInfo'  ID 'OPCODE' FIELD opcode_arfc_noreq
*                    ID 'SERVER' FIELD server
*                    ID 'NOREQ'  FIELD dia_free
*                    ID 'MAXREQ' FIELD dia_max
*                    ID 'REASON' FIELD reason
*                    ID 'TRACE'  FIELD trace.
*
*  IF dia_free GT 1.
*    SUBTRACT 3 FROM dia_free.
*    "SUBTRACT 2 FROM dia_max.
*  ENDIF.
** Für sicherhet muss 3 Prozessen frei bleiben für stabile Arbeit
*  IF dia_free LE 1.
*    MESSAGE e000(38)
*       WITH 'Not enough processes free'.
*  ENDIF.
*
*  IF sy-subrc <> 0.
** Implement suitable error handling here
*  ENDIF.
*
*  IF sy-subrc <> 0.
** Implement suitable error handling here
*  ENDIF.
*
*  IF dia_free > 10.
*    dia_free = 10.
*  ENDIF.

*Wenn zu viel Prozesen oder 0 Prozessen ausgewhlt wäre,
*    wird maximal Anzahl von Prozessen durchgeführt

  IF p_proz = 0 OR p_proz > free_batch.
    p_proz = free_batch.
    ENDIF.


  DELETE FROM /gesgts/sp_check.
  UPDATE /gesgts/sp_job SET aktiv = ' '.



*Full alle Tabellennamen


  SELECT * INTO TABLE dd02l_tab
    FROM dd02l
    WHERE    as4local = 'A'
             AND   clidep   = 'X'
             AND ( tabclass EQ 'TRANSP'
             OR    tabclass EQ 'POOL'
             OR    tabclass EQ 'CLUSTER' ).





  IF p_clust = 'X'.
    DATA: i          TYPE i,
          tabname    TYPE tabname.


    LOOP AT dd02l_tab WHERE tabclass EQ 'CLUSTER'.
      i = sy-tabix + 1.
      dd02l_tab-tabname =  dd02l_tab-sqltab.
      CLEAR dd02l_tab-sqltab.
      CLEAR dd02l_tab-contflag.
      dd02l_tab-tabclass = 'TABCLUST'.
      MODIFY dd02l_tab.
      tabname = dd02l_tab-tabname.
      LOOP AT dd02l_tab FROM i
                        WHERE tabclass EQ 'CLUSTER'
                          AND sqltab = tabname.
        DELETE dd02l_tab.
      ENDLOOP.
    ENDLOOP.
  ENDIF.


  SORT dd02l_tab.

  DELETE ADJACENT DUPLICATES FROM dd02l_tab COMPARING tabname.




  DESCRIBE TABLE dd02l_tab LINES gv_lines.





  DATA:   teiler TYPE i,
        counter TYPE i .



  gv_lines = 100. "Nur für Testzwecke
  counter = 1.

  WHILE counter <= gv_lines.
    CLEAR: gs_tab, teiler.
    teiler = counter MOD p_proz.



    CASE teiler.

      WHEN '1'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q1.
      WHEN '2'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q2.
      WHEN '3'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q3.
      WHEN '4'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q4.
      WHEN '5'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q5.
      WHEN '6'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q6.
      WHEN '7'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q7.
      WHEN '8'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q8.

      WHEN '9'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q9.

      WHEN '0'.
        READ TABLE dd02l_tab INTO gs_tab INDEX counter.
        APPEND gs_tab TO gt_tab_q0.
    ENDCASE.
    ADD 1 TO counter.
  ENDWHILE.


  CLEAR gt_tab.

  PERFORM read_size.



  " ENDIF.
*&---------------------------------------------------------------------*
*&      Form  READ_SIZE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_FREE  text
*      -->P_GT_TAB_Q1  text
*      -->P_GT_TAB_Q2  text
*      -->P_GT_TAB_Q3  text
*      -->P_GT_TAB_Q4  text
*----------------------------------------------------------------------*
FORM read_size.

  DATA gt_used_tmp TYPE /gesgts/sizetab_t.
  DATA q_tab_tmp TYPE /gesgts/tabname_t.
  DATA: counter TYPE i,
        job_name TYPE TBTCJOB-JOBNAME.


  counter = 0.
  s_mandt-high = 800.
  s_mandt-low = 500.

* Hier sollte jetzt zuerst eine Verarbeitung
* für die Ermittlung der zu verarbeitenden Pakete stehen
* und ein Loop statt der einzelnen Aufrufe
* Aber ! das System prüft ob es überhaupt freie WP
* und die Belastung nicht so hoch wird, ausserdem
* dürfen höchstens 10 Prozesse gestartet werden &#40;ERP2004&#41;

  WHILE counter < p_proz.

    CASE counter.
      WHEN '1'.
        new_taskname = 'Prozess_1'.
        q_tab_tmp = gt_tab_q1.
      WHEN '2'.
        new_taskname = 'Prozess_2'.
        q_tab_tmp = gt_tab_q2.
      WHEN '3'.
        new_taskname = 'Prozess_3'.
        q_tab_tmp = gt_tab_q3.
      WHEN '4'.
        new_taskname = 'Prozess_4'.
        q_tab_tmp = gt_tab_q4.
      WHEN '5'.
        new_taskname = 'Prozess_5'.
        q_tab_tmp = gt_tab_q5.
      WHEN '6'.
        new_taskname = 'Prozess_6'.
        q_tab_tmp = gt_tab_q6.
      WHEN '7'.
        new_taskname = 'Prozess_7'.
        q_tab_tmp = gt_tab_q7.
      WHEN '8'.
        new_taskname = 'Prozess_8'.
        q_tab_tmp = gt_tab_q8.
      WHEN '9'.
        new_taskname = 'Prozess_9'.
        q_tab_tmp = gt_tab_q9.
      WHEN '0'.
        new_taskname = 'Prozess_0'.
        q_tab_tmp = gt_tab_q0.

    ENDCASE.

     UPDATE /gesgts/sp_job
      SET aktiv = 'X'
      WHERE job_name EQ new_taskname.




    CALL FUNCTION '/GESGTS/RSTABLESIZE_TAB' IN BACKGROUND TASK
    EXPORTING
      im_client_low = s_mandt-low
      im_client_hi  = s_mandt-high
      im_noclassl   = p_nol
      im_noclassa   = p_noa
      im_tab        = q_tab_tmp
      im_taskname   = new_taskname
*                IMPORTING
*                  EX_SUMTAB           = gt_used_q1

    EXCEPTIONS
   communications_failure       = 1
   system_failure               = 2
   OTHERS                       = 3                        .

    IF sy-subrc <> 0.
      IF sy-subrc = 1.
        MESSAGE i046.
      ELSEIF sy-subrc = 2.
        MESSAGE i047.
      ELSEIF sy-subrc = 3.
        MESSAGE i048 WITH new_taskname.
      ENDIF.



    ENDIF.

    COMMIT WORK.

    CLEAR: q_tab_tmp, new_taskname, job_name.
    ADD 1 TO counter.

  ENDWHILE.

ENDFORM.                    "read_size

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Вс, фев 23 2014, 11:24 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Я бы сделал следующим образом:
1. Всю необходимую информацию о таблицах (название, тип, название поля с мандатом, обработку по типам таблиц) вынес бы в программу. Сейчас часть информации выбирается в программе, а часть - в ФМ
2. Отсортировал бы таблицы по типу и названию, а еще лучше - по размеру (см. системную таблицу MaxDB TABLESIZE)
3. В ФМ оставил бы только простейшую выборку
Code:
select (table-mandt_name) count( * )
into table lt_size
from (table-table_name)
client specified
group by (table-mandt_name).

4.Обновление статистики вынес бы в основную программу.

Ну и посмотрел бы стандартный код sap по обработке параллельных процессов, как советовал dump.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Вс, фев 23 2014, 14:32 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
воможно если база не распределена то распараллеливание наоборот замедлит работу


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Вс, фев 23 2014, 18:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
trop: простите, что? Как бэ нормальные реляционные субд заточены на многопользовательскую работу. Распараллеливание через starting new task просто выделяет еще 1 диалоговый процесс. Т.е. пока все ок с диалог. процессами и пока есть ресурсы СУБД на обработку, распараллеливание работает нормально. Как это связано с распределенностью базы, если не секрет?

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

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Вс, фев 23 2014, 21:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Кодер написал(а):
Печально только, что в данной задаче, в пределе мы получаем чтение каждой из таблиц бд по full scan, ну может быть за исключением сааамых маленьких полностью закешированных. Даже статистику и ту по частям больших таблиц собирают, а тут...

Ну был бы это Oracle или другая большая БД типа DB2, в которую встроены хитрые оптимизаторы, можно было бы по статистике индексов собрать информацию. Про MaxDB ничего сказать не могу :?
Кстати, здесь тоже задачу можно упростить - брать только таблицы класса "A".

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Вс, фев 23 2014, 23:16 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
Это уже сделано можно выбирать только таблицы класса А или класса В. Сейчас приболел и думаю пока не скоро доберусь до работы. Последнее что думал сделать, вместо запуска ФМ запустить параллельно несколько репортов через JOB_SUBMIT. Идея такая, инициирующий репорт делает выборку таблиц, присваивает каждому имени в таблице индекс(в зависимости от количества доступных параллельных процессов) и сохраняев все в таблицу БД. Далее инициируется запуск другого репорта, с передачей ему индекса. Второй репорт выбирает запускает вышеописанный ФМ и сохраняет результаты и таблицу БД. (Комбинированный ключ (Номер процесса, номер клиента), размер. Далее ждем пока все процессы будут отмечены как завершенные и после этого собираем результаты. В четверг думаю проверить. Спасибо всем за содействие.

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пн, фев 24 2014, 07:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Удав: В MaxDB, если верить мануалам, все тоже самое. Беда только, что для больших таблиц использование индекса будет отключаться оптимайзером.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пн, фев 24 2014, 09:39 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Кодер написал(а):
Удав: В MaxDB, если верить мануалам, все тоже самое.

По мануалам SAP там совместимость на уровне Oracle 7. А сейчас у Oracle уже 11 версия, причем оптимизатор серьезно менялся, начиная с 8 версии...

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 26 2014, 12:31 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
Кодер написал(а):
trop: простите, что? Как бэ нормальные реляционные субд заточены на многопользовательскую работу.... Как это связано с распределенностью базы, если не секрет?
рано или поздно все эти накладки упираются в дисковую подсистему


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB