运行时类型服务(RTTS)是否使用数据库来获取数据描述?

Do Runtime Type Services (RTTS) use database to get data descriptions?

问题

使用 describe_by_dataget_ddic_field_listget_componentscl_abap_typedescr 和类似方法)之类的方法,从数据库中检索数据还是在应用程序服务器上生成数据?

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

Google 也没有给我关于这个主题的任何具体信息。

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

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

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

在大多数情况下,我可以通过实现静态变量(并且每个会话只处理一次)来解决性能损失(如果有的话),但是我 运行 遇到过类似的情况,其中静态变量是不是一个选项(处理是在未知类型上进行的)并且我不得不放弃这个想法,因为我不确定如果调用这些方法它将如何影响峰值性能,比如说每个会话 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.

我不能确定最新的 ABAP 版本,但是 ABAP 字典的东西(又名 "DDIC" 数据字典)源自 数据库表 DDNTT 和 DDNTF(也称为 "nametab",其元素称为"database runtime objects"),在激活DDIC对象(表等,如@icbytes所说,这些表是DD02L,DD03L,和依此类推)。

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

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

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

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