0

我目前正在学习 ABAP,任何人都可以解释为什么t_table2 = t_table1明显快于APPEND LINES OF t_table1 TO t_table2

t_table1, t_table2 是内部表

4

3 回答 3

4

除了 Zero 和 Cameron Smith 的答案之外,还有一个称为“表共享”(又名“写时复制”)的概念,它会延迟复制,直到任何源或目标内部表发生更改。

如果我简化很多,可以将其表示为 8 个字节的副本(源内部表的地址)的分配。无论如何,大多数时候,2个内部表中的一个会被更改(否则,为什么代码中会有副本!)所以最终的性能通常几乎相同,只是有时因为一些而有好处代码“写得很糟糕”。

于 2018-07-05T18:58:03.603 回答
2

我不能说这是一个完整的原因(幕后可能还有更多我不知道的事情),但其中一些原因肯定包括以下内容。这里要注意一点:在中小型数据集上,速度差异可以忽略不计。

t_table2 = t_table1只需获取所有数据并复制它,覆盖t_table2(它不会append)。在某些情况下(例如传递参数时),数据甚至不会被复制。可以使用相同的数据,并且只有在需要更改 t_table2 时才会生成副本。

APPEND LINES OF t_table1 TO t_table2基本上是一个循环,它逐行追加记录。

我提到的原因append是因为表的覆盖可以像从ato复制数据(或在极少数情况下的数据引用)一样简单b,而 append 执行检查表是否已排序、索引等。即使表处于最基本的状态,附加内部表也是比覆盖变量稍微复杂的过程。

于 2018-07-05T07:23:12.233 回答
2

内存分配

当您使用 DATA 定义内部表时,内核会在内存中分配多于一行的空间,因此它们存储在一起。此外,每次您填写这些行时,都会再次预订更大的批次。
您可以在内存转储中看到这一点,在这种情况下,将分配 16 行: 新请求的行数:16

当您使用 复制时APPEND LINES OF,内核会逐行复制。

当您只说itab1 = itab2时,它会被复制到块中。

快多少

根据上面的信息,您可能认为逐行慢了 16 倍。实际上,它并不取决于行宽、行数、内核版本和许多其他因素,它只会慢 10-30%。

于 2018-07-21T19:44:38.853 回答