ABAP Dynami c Внутренняя таблица, Classi c ALV, проблема производительности - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть приведенный ниже код, выполнение которого занимает более 200 минут, не могли бы вы помочь мне улучшить производительность.

Этот код запускается по команде пользователя. Скажем, пользователи выбирают все записи (около 300 тыс. Записей) на выходе первого уровня для детализированного отчета следующего уровня:

  1. Динамическая c внутренняя таблица <OI_TABLE> имеет около 300 тыс. Записей с полем компонент с именем BOX помечен как 'X' для выбранных пользователем строк.

  2. Программа считывает выбранные строки из внутренней таблицы dynamici c (<OI_TABLE>), сравните их с другой стандартной внутренней таблицей (GT_BSIS), которая содержит около 300 КБ записей, значение очищающего ключа должно быть одинаковым для обеих внутренних таблиц (1:N кардинальность).

  3. It затем вставляет эти общие записи в третью стандартную внутреннюю таблицу (GT_L2_DISP) для дальнейшей обработки / отображения.

Код:

LOOP AT <oi_table> ASSIGNING <oi_line>.
  ASSIGN COMPONENT 'BOX' OF STRUCTURE <oi_line> TO <oi_field>.
  IF <oi_field> = 'X'.
    ASSIGN COMPONENT 'CLEARING_KEY' OF STRUCTURE <oi_line> TO <oi_field>.
    LOOP AT gt_bsis WHERE clearing_key = <oi_field>.
      MOVE-CORRESPONDING gt_bsis TO gt_l2_disp.
      APPEND gt_l2_disp.
    ENDLOOP.
  ENDIF.
ENDLOOP.

Здесь, <oi_table> содержит данные для выхода ALV первого уровня, а GT_BSIS будет содержать данные для выхода ALV 2-го уровня.

Мое понимание:

Если мы можем заполнить стандартную внутреннюю таблицу GT_BSIS и маркировку / прохождение 'X' к столбцу (с) ay FLAG) в GT_BSIS, , пока пользователь выбирает строки из выходных данных первого уровня ALV , это может помочь в производительности, поскольку можно избежать ОДНОГО Loop .. Endloop.

Индексированный внутренний стол также может быть вариантом. Пожалуйста, предложите способ повышения производительности.

Примечание: наша система SAP E CC, ABA 7.31, поэтому, пожалуйста, не предлагайте встроенный код / ​​объявление.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

@ Zero, Большое спасибо Zero за ваш ответ и ценную обратную связь. Спасибо, я сделал это, и вот код ниже, который я использовал. Производительность / время выполнения резко снижена с 210 минут до скважины. Ниже 5 минут для записей 340K для обеих этих внутренних таблиц,

DATA: git_ibsis TYPE HASHED TABLE OF modbsis_layout1 
                     WITH UNIQUE KEY clearing_key belnr buzei,
      gwa_ibsis LIKE LINE OF git_ibsis.    

FIELD-SYMBOLS : <gfs_ibsis>     LIKE LINE OF git_ibsis.

DATA : lv_clkey(12)   TYPE c,
       lv_box(3)      TYPE c.

       lv_clkey = 'CLEARING_KEY'.   
       lv_box   = 'BOX'.

         SORT : ibsis BY clearing_key belnr buzei,
                <oi_table> BY ('BOX') ('CLEARING_KEY').

         LOOP AT ibsis.
           MOVE-CORRESPONDING ibsis TO gwa_ibsis.
           INSERT gwa_ibsis INTO TABLE git_ibsis.
           CLEAR : gwa_ibsis, ibsis.
         ENDLOOP.

         SORT : git_ibsis BY clearing_key belnr buzei.

         LOOP AT git_ibsis ASSIGNING <gfs_ibsis>.
           READ TABLE <oi_table> ASSIGNING <oi_line> WITH KEY  
                      (lv_box)   = gc_x
                      (lv_clkey) = <gfs_ibsis>-clearing_key BINARY SEARCH.
           IF sy-subrc = 0.
             MOVE-CORRESPONDING <gfs_ibsis> TO zvxl100.
             APPEND zvxl100.
           ENDIF.   
         ENDLOOP.

Примечание : используется хешированный внутренний Таблица,

Производительность / время работы уменьшены с 210 минут до нуля ниже 5 минут,

0 голосов
/ 13 февраля 2020

Я могу ошибаться, но изменение петель может вам чем-то помочь. Теоретически это должно уменьшить экспоненциальный рост итераций при увеличении двух таблиц.

Я думаю, что обращение может помочь, потому что вам не нужно <OI_TABLE> для чего-либо, кроме фильтрации, но вы все равно зацикливаетесь на нем. Это означает, что оба цикла повторяются по нескольким строкам, и вы иногда можете вызвать полное сканирование GT_BSIS, если не существует соответствующего ключа (я не совсем уверен, что в циклах используется индексация).

sort <oi_table> by ('CLEARING_KEY'). "Only if table isn't already a sorted table
Loop at GT_BSIS assigning <ls_bsis> where "Assigning! Don't make copies of each row on each iteration, if you can help it
    read table <oi_table> ASSIGNING <oi_line> with key ('CLEARING_KEY') = <ls_bsis>-clearing_key binary search. 
    check sy-subrc = 0. 
    assign component 'BOX' of structure <oi_line> to <oi_field>
    if <oi_field> = 'X'.
      MOVE-CORRESPONDING <ls_bsis> TO gt_l2_disp.
      append ls_l2_disp to gt_l2_disp.
    endif.
endloop.
...