繁体   English   中英

默认情况下内部表是如何排序的?

[英]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时,它才会更快。

声明标准表的主键(默认键或显式组件)是一种在SORTREAD TABLE等之后不提及组件的方法,但 ABAP 文档建议在SORTREAD 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 TABLETYPE HASHED TABLE (或任何具有辅助键的替代语法)声明表,它确实会对表进行排序并且访问速度更快,编译器将发送与标准表相比,使用SORT (错误,因为已经排序)、 READ TABLE等更好的警告或错误消息(如果您使用 ATC,则只有一些警告)。

更多信息,请参阅ABAP 文档 - itab - 表类别的选择

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM