我找到了一个程序,其中有数百条记录循环显示,它们从12个不同的表中选择字段值的描述(例如umskz,fdgrv等)。
我知道最好的方法是在通过联接获取这些字段的值时进行描述。
但是如果由于某种原因我不想这样做,这是获取描述的下一个最佳实践吗?
通过从表中选择每条记录?或
通过将它们加载到ITAB中,并为每条记录阅读ITAB并获得描述?
当然,当我完成第二种方法的描述时,我将释放ITAB。
期待您的意见。
谢谢
埃里亚斯
答案 0 :(得分:3)
您的问题有点模糊,所以让我首先总结一下我的理解:
您要从一个“中央”表中选择包含1M条记录的大量数据。数据有11列,其中包含代码。您想加入这些代码的描述。
您的设置听起来像是星型模式。最好的选择(尤其是对于SAP S / 4 HANA)通常是创建一个CDS视图,该视图描述所需的联接并产生与您所需形式完全相同的输出。这样一来,数据库就可以在选择数据之前很好地执行昂贵的执行路径计算,从而使数据库可以选择为您提供数据的最佳方式。
使用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.
第三个最佳选择,这是您最初要寻求的,通常是对主数据的预选,然后是对代码描述的后续选择,以及ABAP中的最终“联接”。范围表可以简化选择所需代码的过程。 SORTED表可以确保联接提供可接受的性能:
" 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个小时的工作的程序员可能正在遵循他们的最佳实践...