我必须从表中读取10.000.000条记录。
是否更好:
SELECT ... ENDSELECT
(不带内部表)一一读取这些记录SELECT ... INTO TABLE itab
一次读取所有这些内容,然后通过此内部表进行遍历?答案 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
,这并不是因为它本身的性能,而是要使其他改进变得更容易。