在 S/4 Hana 中阅读 table 的最佳实践

Best practice reading table in S/4 Hana

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

期待您的意见

谢谢
埃利亚斯

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

您想要 select 包含来自一个 "central" table 的 1M 条记录的大型数据集。数据有 11 列包含代码。您想加入这些代码的说明。

您的设置听起来像星型模式。最好的选择,尤其是对于 SAP S/4 HANA,通常是创建一个 CDS 视图来描述所需的连接并生成完全符合您需要的形式的输出。这允许数据库在您 select 处理数据之前就执行昂贵的执行路径计算,从而允许数据库选择最佳方式为您提供数据。

使用 SAP HANA 执行此操作的第二个最有效的方法是单个 OpenSQL SELECT,它在一个步骤中通过 LEFT OUTER 连接连接所有数据。您已经自己找到了这个,但为了清楚起见,让我用伪代码重复一遍:

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.

第三个最佳选择,也就是您最初要求的,通常是 pre-selection 主要数据,然后是随后的 select 代码描述部分,再加上最后一个"join" 在 ABAP 中。范围 tables 可能会简化 selecting 所需的代码。 SORTED tables 可以确保连接提供 acceptable 性能:

" 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 小时工作的程序员当时可能遵循了他们的最佳实践...