内部table默认是怎么排序的?

How is the internal table sorted by default?

所以我想知道我什么时候申报

lt_table TYPE STANDARD TABLE OF mara.

一样吗
lt_table TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.

或者在未声明 DEFAULT KEY 时是否选择了不同的标准 table 键?

也一样,在ABAP documentation中有说明:

If no explicit primary key is defined for a standard table, it automatically has a standard key.

A standard key 是指 DEFAULT KEY(下面的第一个要点)或什么都不做(第二个要点):

The standard key can be declared as follows:

  • Explicitly, using the additions UNIQUE|NON-UNIQUE KEY of the statements TYPES, DATA and so on, where the addition DEFAULT KEY is specified instead of the list of components.
  • Implicitly, if no explicit primary key specification is made in the declaration of a standard table with the statement DATA.
  • Implicitly, if a standard table type with a generic primary table key is specified behind TYPE in the statement DATA.

2022 年 5 月 31 日编辑:“标准键 table”的含义可能会有些混淆。这可能会让人们认为 table 已排序,然后访问速度更快。

错了。

只有当你明确地排序你的内部 table SORT itab BY comp1 comp2 时才会更快(一次因为它很耗时),并使用 READ TABLE itab WITH KEY comp1 = ... comp2 = ... BINARY SEARCH.

声明标准的主键(默认键或显式组件)table是一种不提及SORTREAD TABLE等组件的方法,但是ABAP 文档建议在 SORTREAD TABLE

之后显式声明它们

因此,我看不出有任何人有兴趣声明标准 table 的主键。

注意:COLLECT 仅基于标准 table 的主键工作,因此这里别无选择,除非您将 COLLECT 替换为如下代码:

ASSIGN itab[ c1 = line-c1 c2 = line-c2 ] TO FIELD-SYMBOL(<exist_line>).
IF sy-subrc = 0.
  <exist_line>-counter = <exist_line>-counter + line-counter.
ELSE.
  INSERT line INTO TABLE itab.
ENDIF.

如果你想使用排序的 table 来加快访问速度,最好用 TYPE SORTED TABLETYPE HASHED TABLE 声明 table(或任何其他语法以具有辅助键),它将真正对 table 进行排序并且访问速度更快,编译器将使用 SORT(错误因为已经排序)、READ TABLE 等发送更好的警告或错误消息,而不是标准 table(如果您使用 ATC,只有一些警告)。

有关详细信息,请参阅 ABAP documentation - itab - Selection of the Table Category