如何提高abap中具有大量条目的2个表的嵌套循环的性能?

sum*_*til 1 performance abap internal-tables

两个表均按键 KNO 排序

\n
    LOOP AT lt_header INTO lwa_header.\n\n         LOOP AT lt_items INTO lwa_item\n\n                 WHERE key = lwa_header-KNO\n\n                \xe2\x80\x9c\xe2\x80\xa6\xe2\x80\xa6\xe2\x80\xa6.\n\n          ENDLOOP.\n\n     ENDLOOP.\n
Run Code Online (Sandbox Code Playgroud)\n

如果表中的条目数量很大,这将需要更多时间来执行。我应该如何修改代码以提高性能?

\n

Phi*_*ipp 5

您应该能够通过使用辅助表键来改进第二个表中的查找。声明表变量时需要声明这样的键:

DATA lt_items TYPE TABLE OF whatever WITH NON-UNIQUE SORTED KEY k1 COMPONENTS key.
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此键来加速该表中的查找O(n)O(log n)时间复杂度:

LOOP AT lt_header INTO lwa_header.
  LOOP AT lt_items INTO lwa_item
          USING KEY k1
          WHERE key = lwa_header-KNO.
    "...
  ENDLOOP.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

当您可以保证 lt_items-key 中的值始终是唯一的(没有两行具有相同的“key”值)时,您甚至可以使用散列键,这甚至更快(恒定时间):

DATA lt_items TYPE TABLE OF whatever WITH UNIQUE HASHED KEY k1 COMPONENTS key.

LOOP AT lt_header INTO lwa_header.
  READ TABLE lt_items INTO lwa_item
          WITH TABLE KEY k1
          COMPONENTS key = lwa_header-KNO.
  IF sy-subrc = 0.
     "...
  ENDIF.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

  • @sumedhpatil 当此答案回答了您的问题时,请通过单击旁边的复选标记图标来接受它。这样问题就会在问题列表中显示为已回答。 (2认同)