Abap S/4 Hana中的最佳实践阅读表

Abap S/4 Hana中的最佳实践阅读表,abap,Abap,我发现了一个程序,在这个程序中,他们从12个不同的表中选择了100条记录来描述字段值,例如umskz、fdgrv等。 我知道最好的方法是在通过联接获取这些字段的值时进行描述。 但是,如果出于某种原因我不想这样做,为了得到描述,下一个最佳实践是什么? 通过从每个记录的表中选择?或 通过将它们加载到ITABs中,并为每个记录读取ITABs并获取描述? 当然,当我以第二种方式获得描述后,我将释放ITAB 我期待着您的意见 谢谢 Elias你的问题有点模糊,所以让我先总结一下我的理解: 您希望从一个中心

我发现了一个程序,在这个程序中,他们从12个不同的表中选择了100条记录来描述字段值,例如umskz、fdgrv等。 我知道最好的方法是在通过联接获取这些字段的值时进行描述。 但是,如果出于某种原因我不想这样做,为了得到描述,下一个最佳实践是什么? 通过从每个记录的表中选择?或 通过将它们加载到ITABs中,并为每个记录读取ITABs并获取描述? 当然,当我以第二种方式获得描述后,我将释放ITAB

我期待着您的意见

谢谢
Elias

你的问题有点模糊,所以让我先总结一下我的理解:

您希望从一个中心表中选择一组包含1M条记录的大型数据。数据有11列,其中包含代码。您想加入这些代码的描述

您的设置听起来像一个星型架构。最好的选择,尤其是使用SAP S/4 HANA时,通常是创建一个CDS视图,该视图描述所需的联接并生成所需格式的输出。这允许数据库在选择数据之前执行昂贵的执行路径计算,从而允许数据库选择最佳的方式来提供数据

使用SAP HANA实现这一点的第二种最有效的方法是一个OpenSQL SELECT,它在一个步骤中将所有数据与左侧外部联接联接起来。您已经自己发现了这一点,但为了清晰起见,让我用伪代码重复一下:

SELECT 
    <central table>-<field list>,
    <first code table>-description AS description_1,
    ...
    <eleventh code table>-description AS description_11
  INTO TABLE DATA(data)
  FROM <central table>
  LEFT OUTER JOIN <first code table>
    ON <central table>-<first code field> = <first code table>-key
  ...
  LEFT OUTER JOIN <eleventh code table>
    ON <central table>-<eleventh code field> = <eleventh code table>-key.
第三个最佳选择,也就是您最初要求的,通常是预先选择主数据,然后选择后续的代码描述,再加上ABAP中的最终连接。范围表可以简化所需代码的选择。排序表可确保联接提供可接受的性能:

" select the main data
SELECT <central table>-<field list>
  FROM <central table>
  INTO CORRESPONDING FIELDS OF TABLE data.

" collect the codes
LOOP AT data REFERENCE INTO DATA(record).

  INSERT VALUE #(
      sign = 'I'
      option = 'EQ'
      low = record-<first code field> )
    INTO TABLE first_codes_range.

  ...

  INSERT VALUE #(
      sign = 'I'
      option = 'EQ'
      low = record-<eleventh codde field> )
    INTO TABLE eleventh_codes.

ENDLOOP.

" select the descriptions
SELECT <key>, description
  FROM <first code table>
  INTO TABLE first_descriptions
  WHERE <key> IN first_codes.

...

SELECT <key>, description
  FROM <eleventh code table>
  INTO TABLE eleventh_descriptions
  WHERE <key> IN eleventh_codes.

" join main data and descriptions
LOOP AT data REFERENCE INTO record.
  record->description_1 =
    first_descriptions[ <key> = record-><first code field> ]-description.
  ...
  record->description_11 =
    eleventh_descriptions[ <key> = record-><eleventh code field> ]-description.
ENDLOOP.

正如@Sandra Rossi所指出的,性能是一种高度个性化的东西,它以微小的细节起起落落,常常违背最佳实践。因此,这些建议只能是:建议。编写您正在改进的13小时工作的程序员可能遵循了他们当时的最佳实践…

一如既往,这取决于具体情况,数据量、缓冲表与否、代码复杂性与性能等。根据经验法则,一次查询数据库+从内存中读取每条记录,通常比每个记录查询一次要快,这仅仅是因为即使使用内存中的数据库,数据库访问速度也较慢。这一经验法则甚至不限于HANA。但是你问了一个非常,我不知道如何根据stackoverflow指南来回答。谢谢你Sandra,你的回答帮了我很多。我不认为我的问题是主观的。它是关于最佳实践的。这个程序是一个循环选择,循环选择。。。这不好。我所做的是选择2个select联接中的几乎所有字段,并在ITAB中读取我无法读取的字段,然后使用并行技术;θε与二进制搜索。在旧的ECC6 SAP系统7.02(100万KUNRS)中,此旧报告运行13小时50分钟,我所做的更改将在40分钟内在线运行或在后台运行50分钟。程序员必须遵循最佳实践。再次感谢Hana数据库,最好的做法是将尽可能多的代码下推到数据库中,无论是通过OpenSQL还是CDS视图。在scn.sap.com上有几篇文章介绍了详细信息。如果您的系统足够新,7.40 ehp5+CDS视图比计算或分析视图更可取。OpenSql select并不比视图差或慢。如果您使用相同的过滤条件从相同的表中检索相同的字段,那么您将从OpenSql、视图甚至AMDP中获得相同的速度。谢谢Florian。我要说的是,即使在2013年,你也不会去KNB1,然后循环,然后从KNA1,然后是KNVV,然后是BKPF。。。。这不是最佳做法。即使在2013年,也出现了连接或并行处理技术。无论如何,我喜欢用更少、更高效的代码编写程序。再次感谢您的详细解释。@Ekakos,并行处理应该是您的最后手段,在其他一切都完全优化之后,它仍然不是enough@Florian在HANA中,已优化的计划存储在计划缓存中-因此,如果语句哈希为已缓存的计划,则CDS视图不应每次触发计划计算