[英]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 时选择了不同的标准表键?
正如ABAP 文档中所解释的那样:
如果没有为标准表定义显式主键,它会自动具有标准键。
标准键是当您指示DEFAULT KEY
(下面的第一个项目符号点)或什么都没有(第二个项目符号点)时:
标准密钥可以声明如下:
- 明确地,使用语句 TYPES、DATA 等的添加 UNIQUE|NON-UNIQUE KEY,其中指定添加 DEFAULT KEY 而不是组件列表。
- 隐含地,如果在声明带有语句 DATA 的标准表中没有明确指定主键。
- 隐含地,如果在语句 DATA 中的 TYPE 后面指定了具有通用主表键的标准表类型。
编辑 2022 年 5 月 31 日:“标准表的键”的含义可能会有些混淆。 这可能会使人们认为表格已排序,然后访问速度更快。
那是错误的。
只有当你明确地对你的内部表SORT itab BY comp1 comp2
(一次因为它很耗时)并使用READ TABLE itab WITH KEY comp1 = ... comp2 = ... BINARY SEARCH
时,它才会更快。
声明标准表的主键(默认键或显式组件)是一种在SORT
、 READ TABLE
等之后不提及组件的方法,但 ABAP 文档建议在SORT
、 READ TABLE
等之后显式声明它们。
因此,我认为声明标准表的主键没有任何兴趣。
注意: COLLECT
仅基于标准表的主键起作用,因此这里没有选择,除非您将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.
如果您想使用排序表来更快地访问,更喜欢使用TYPE SORTED TABLE
或TYPE HASHED TABLE
(或任何具有辅助键的替代语法)声明表,它确实会对表进行排序并且访问速度更快,编译器将发送与标准表相比,使用SORT
(错误,因为已经排序)、 READ TABLE
等更好的警告或错误消息(如果您使用 ATC,则只有一些警告)。
更多信息,请参阅ABAP 文档 - itab - 表类别的选择
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.