什么时候使用内部表?

When to use internal tables?

所以,我读到使用内部 tables 可以提高程序的性能,我们应该尽可能少地对 DB tables 进行操作。但是我已经开始从事一个根本不使用内部 tables 的项目。

一些细节:

这是一个添加或删除产品的扫描器 in/from 商店。首先检查主键(查看是否存在该类型的产品),然后添加或删除该产品。我们使用“插入”和“删除自”来直接从数据库 table.

add/remove 产品

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

这是我目前的情况:将所有产品插入内部 table,将删除的产品放入另一个内部 table。

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.

但是我什么时候可以执行此更新? 我可以设置一个“保存按钮”来执行更新,但是这样会有用户忘记保存大量数据,或掉落扫描仪,将其关闭或类似情况的风险。所以这显然不是一个好的解决方案。 我的最后一个问题是:在这样的项目中是否有一种(好的)方法来实现内部 tables?

internal tables 应该用于数据处理,如其他语言(c#,java ...)中的列表或数组。从性能和系统负载的角度来看,最好先将您需要的所有数据加载到内部 table,然后处理该内部 table,而不是从数据库加载单个记录。

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

如果您有充分的理由立即从数据库读取或更新记录,您应该这样做。如果您可以安全地将更新和删除延迟到可以一起处理所有更新和删除的时间点,而不会冒不一致的风险,我认为这不是一种改进。但如果有充分的理由(如一致性或数据丢失)立即更新,那就去做吧。

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