Abap 何时使用内部表?

Abap 何时使用内部表?,abap,internal-tables,Abap,Internal Tables,因此,我读到使用内部表可以提高程序的性能,我们应该尽可能减少对DB表的操作。但我已经开始从事一个完全不使用内部表的项目 一些细节: 它是一种扫描仪,用于在商店中添加或删除产品。首先检查主键以查看该类型的产品是否存在,然后添加或删除该产品。我们使用“插入到”和“删除自”直接从DB表中添加/删除产品 我没有问他们为什么不使用内部表,因为到目前为止我还没有更好的解决方案 到目前为止,我已经做到了:在一个内部表中插入所有产品,将删除的产品放在另一个内部表中 Form update. Modify z

因此,我读到使用内部表可以提高程序的性能,我们应该尽可能减少对DB表的操作。但我已经开始从事一个完全不使用内部表的项目

一些细节:

它是一种扫描仪,用于在商店中添加或删除产品。首先检查主键以查看该类型的产品是否存在,然后添加或删除该产品。我们使用“插入到”和“删除自”直接从DB表中添加/删除产品

我没有问他们为什么不使用内部表,因为到目前为止我还没有更好的解决方案

到目前为止,我已经做到了:在一个内部表中插入所有产品,将删除的产品放在另一个内部表中

Form update.
  Modify zop_db_table from table gt_table." – to add all new products
  LOOP AT gt_deleted INTO gs_deleted.
    DELETE FROM zop_db_table WHERE index_nr = gs_deleted-index_nr.
  ENDLOOP.  " – to delete products
Endform.
但我什么时候可以执行此更新? 我可以设置一个“保存按钮”来执行更新,但是用户可能会忘记保存大量数据,或者丢失扫描仪、关闭扫描仪或出现类似情况。因此,这显然不是一个好的解决方案。
我的最后一个问题是:在这样的项目中,有没有一种实现内部表的好方法?

内部表应该用于数据处理,就像其他语言c、java中的列表或数组一样。。。。从性能和系统负载的角度来看,最好先将所需的所有数据加载到内部表中,然后处理该内部表,而不是从数据库中加载单个记录

但对于报告来说,这是最正确的,它可能是最常见的自定义abap程序类型。您经常看到开发人员使用select…endselect语句,该语句实际上在数据库表上循环,一次一行地将行传输到报表。与一次将所有记录读入itab,然后在itab上循环相比,这是非常慢的。我不止一次通过消除对数据库的往返,将报表的执行时间缩短到了一小部分

如果您有充分的理由立即从数据库中读取或更新记录,则应该这样做。如果您可以安全地将更新和删除延迟到一个时间点,在这些时间点,您可以一起处理它们,而不冒不一致性,我会考虑改进。但是,如果有一个很好的理由,比如一致性或数据丢失,那么就立即更新


更新:正如@vwegert提到的select endselect语句,该语句实际上并没有为每一行创建单独的数据库查询。应用服务器的数据库接口优化查询,将行批量传输到应用服务器。从那里,记录被一个一个地传输到abap报告,因为在报告中只有一个工作区存储一行,这对性能有很大影响,特别是对于具有大型结果集的查询。只要有足够的内存来保存行,选择一个内部表可以将所有行直接传输到abap报表,因为现在有一个内部表来保存报表中的记录。

因此,显然这不是一种常见的abap程序类型。从我所读到的内容来看,我认为必须始终使用内部表,但您的回答很有道理。更复杂的abap应用程序并不少见,但仅显示一些聚合数据的短报告更常见。由于它们主要从数据库中读取大量数据,因此在这一点上对它们进行优化非常有意义。SELECT-ENDSELECT语句部分错误。请给我们看数据来证明你的说法。@vwegert:你说得有点对,我的说法过于简单了。数据库本身并不是针对每一行进行查询,而是有一个优化,将数据包中的行从数据库传输到应用服务器。但是从数据库接口到报表的传输是逐行进行的。我将更新我的答案。@DirkTrilsbeek真正应该提醒人们的是,这种分块传输必须保持打开数据库游标,如果有人发出提交,该游标可能会强制关闭。这是SELECT的主要问题。。。ENDSELECT—不是性能。因此,我读到使用内部表可以提高程序的性能,我们应该尽可能减少对DB表的操作。-我建议你不要再听那些给出如此笼统建议的人了