在 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 小时工作的程序员当时可能遵循了他们的最佳实践...
我发现了一个程序,在循环中有数百条记录,他们从 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 小时工作的程序员当时可能遵循了他们的最佳实践...