问题
(describe_by_data
之类的get_ddic_field_list
,get_components
,cl_abap_typedescr
之类的方法是否从数据库中检索数据或在应用程序服务器上生成?
我查看了这些类,所有一些方法(大概是填充缓存的方法)似乎都是以非标准方式(METHOD ... BY KERNEL MODULE ...
)提取数据的,而其他方法则是从缓存中提取数据的。我想知道如果不缓存它怎么拉。
Google也没有提供有关此主题的任何具体信息。
某些情况下,以防细节变得重要
我一直在研究为某些通用类实现动态选择子句的生成(以替换星号以实现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.
答案 0 :(得分:3)
我不确定最新的ABAP版本如何,但是ABAP词典的内容(对于数据字典而言又名“ DDIC”)源自数据库表DDNTT和DDNTF(也称为“ nametab”)及其元素称为“数据库运行时对象”),它们在DDIC对象(表等,这些表是DD02L,DD03L,如@icbytes等)激活时填充。
当查询它们时,它们也会被传输并保留在每个应用程序服务器内存中。该内存称为 nametab缓冲区。当缓冲区已满时,最新数据将替换旧数据。
不知道性能,但毫无疑问,与您紧随其后的SELECT相比,它可以忽略不计。
关于RTTS的另一件事,始终使用GET_ *方法,而不是CREATE_ *方法,因为它们更快(它们的行为略有不同,但通常只有经验丰富的开发人员才需要使用后者)个)。
如果愿意,可以添加另一层内存,但是我认为这样做是不值得的(开发人员花费了更多时间+消耗了更多的内存,而性能没有大的提高)。