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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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