哪个具有更好的性能:SELECT ... ENDSELECT(1乘1)或SELECT ... INTO TABLE / LOOP AT

时间:2019-04-01 08:43:00

标签: sap abap

我必须从表中读取10.000.000条记录。

是否更好:

  • 使用SELECT ... ENDSELECT(不带内部表)一一读取这些记录
  • 还是要使用SELECT ... INTO TABLE itab一次读取所有这些内容,然后通过此内部表进行遍历?

2 个答案:

答案 0 :(得分:5)

如果所有10,000,000个条目都适合ABAP的主存储器,则应选择一个SELECT ... INTO TABLE ...,然后是LOOP

这将使昂贵的数据库交互降至最低,并且速度最快。

如果记录不适合主存储器,则需要以包形式检索它们。检出PACKAGE SIZE语句的SELECT添加项。

答案 1 :(得分:2)

它们的速度差不多

与流行的看法相反,SELECT ... ENDSELECT不会一一读取行,因此其性能并不比SELECT ... INTO TABLE差很多。参见explanation here

SELECT ... ENDSELECT的一个大问题是它阻止了 other 性能的改进

考虑以下编码:

SELECT matnr FROM mara  
    INTO ls_mara WHERE (...).
  SELECT SINGLE ebeln
      FROM ekpo 
      INTO ls_ekpo 
      WHERE matnr = ls_mara-matnr.
  ...
ENDSELECT.

大多数时间将花费在表ekpo上的SELECT SINGLE上,而解决方案是使用FOR ALL ENTRIES,但是您需要一个内部表。
因此无论如何都必须将其转换为SELECT ... INTO TABLE

SELECT matnr FROM mara 
    INTO TABLE lt_mara WHERE (...).
IF lt_mara IS NOT INITIAL.
  SELECT matnr, ebeln FROM ekpo
      INTO TABLE @lt_ekpo        "make it SORTED by matnr"
      FOR ALL ENTRIES IN @lt_mara
      WHERE matnr = @lt_mara.
ENDIF. 
LOOP AT lt_mara ASSIGNING <fs_mara>.
  READ TABLE lt_ekpo ASSIGNING <fs_ekpo>
      WITH KEY matnr = <fs_mara>-matnr.
  ...
ENDLOOP.

避免使用SELECT ... ENDSELECT,这并不是因为它本身的性能,而是要使其他改进变得更容易。