4

问题

describe_by_data, get_ddic_field_list, get_components(ofcl_abap_typedescr和类似的) 这样的方法是从数据库中检索数据还是在应用程序服务器上生成?

我查看了这些类,所有一些方法(可能是填充缓存)似乎以非标准方式(METHOD ... BY KERNEL MODULE ...)提取数据,而其他方法则从缓存中提取数据。我想知道如果它没有被缓存,它是如何被拉出来的。

谷歌也没有给我任何关于这个话题的具体信息。

一些上下文,以防细节变得相关

我一直在研究为一些通用类实现动态选择子句生成(以替换 S/4HANA 中基于列的处理的星号,并希望减少对 DB 的压力)。

由于这些类中的大多数将数据检索到字典类型结构中,我想我可以使用运行时类型服务 (RTTS) 的类型描述来获取字段列表并根据目标结构动态生成 select 子句。

在大多数情况下,我可以通过实现静态变量(并且每个会话只处理一次)来解决性能损失(如果有的话),但是我遇到过类似的情况,静态变量不是一个选项(处理是在未知的情况下进行的) types),我不得不放弃这个想法,因为我不确定如果调用这些方法会如何影响峰值性能,假设每个会话 30 次。

编辑(只是一段代码,以避免进一步混淆,导致没有实质内容的居高临下的评论):

lo_struct ?= cl_abap_structdescr=>describe_by_data( header ).
ct_components = lo_struct->get_components( ).
"Loop through ct_components appending names to lv_select_clause

lv_select_clause = get_header_fields( is_target_structure = header ).
select single (lv_select_clause)
  from rbkp
  where gjahr = @iv_gjahr
    and belnr = @iv_belnr
  into corresponding fields of @header.
4

1 回答 1

3

我不能确定最新的 ABAP 版本,但是 ABAP 字典的东西(也就是数据字典的“DDIC”)源自数据库表 DDNTT 和 DDNTF(也称为“nametab”,其元素称为“数据库运行时” objects”)在激活 DDIC 对象(表等,这些表是 DD02L、DD03L,如@icbytes 所说的那样)期间填充。

当它们被查询时,它们也会被传输并保存在每个应用程序服务器内存中。此内存称为nametab 缓冲区。当缓冲区已满时,最新数据将替换最旧数据。

不知道性能,但毫无疑问,与您之后执行的 SELECT 相比,它可以忽略不计。

还有一件事,关于 RTTS,总是使用 GET_* 方法而不是 CREATE_* 方法,因为它们更快(它们的行为略有不同,但通常只有有经验的开发人员可能需要使用后者)。

如果您愿意,您可以添加另一层内存,但我认为这样做不值得(花费更多开发人员时间 + 消耗更多内存,而没有大的性能提升)。

于 2018-07-02T17:51:38.523 回答