根据 where 条件过滤内部 table 的最高效方法
Most performant way to filter an internal table based on a where condition
到目前为止,我一直使用它从内部 table:
获取特定行
LOOP AT it_itab INTO ls_itab WHERE place = 'NEW YORK'.
APPEND ls_itab TO it_anotherItab
INSERT ls_itab INTO TABLE it_anotherItab
ENDLOOP.
但是,对于 7.40,似乎有 REDUCE、FOR、LINES OF 和 FILTER。 FILTER 需要一个排序或散列键,在我的示例中不是这种情况。所以我想只有 FOR 有问题。
DATA(it_anotherItab) = VALUE t_itab( FOR wa IN it_itab WHERE ( place = 'LONDON' )
( col1 = wa-col2 col2 = wa-col3 col3 = ....... ) ).
问题是:
- 两者确实在做同样的事情吗?第二个是 APPEND 还是 INSERT?
- 是否可以在第二个变体中使用整个结构而不指定每一列?就像 ( wa )
- 第二个例子更快吗?
根据您的评论,您还可以在标准 table 上定义一个已排序的辅助键。看看这里的这个例子:
TYPES:
BEGIN OF t_line_s,
name1 TYPE name1,
name2 TYPE name2,
ort01 TYPE ort01,
END OF t_line_s,
t_tab_tt TYPE STANDARD TABLE OF t_line_s
WITH NON-UNIQUE EMPTY KEY
WITH NON-UNIQUE SORTED KEY place_key COMPONENTS ort01. "<<<
DATA(i_data) = VALUE t_tab_tt( ). " fill table with test data
DATA(i_london_only) = FILTER #(
i_data
USING KEY place_key " we want to use the secondary key
WHERE ort01 = CONV #( 'london' ) " stupid conversion rules...
).
" i_london_only contains the filtered entries now
更新:
在我的快速和肮脏的性能测试中,FILTER
在第一次调用时很慢,但之后击败了 LOOP-APPEND
变体。
更新 2:
今天找到原因了...
... the administration of a non-unique secondary table key is updated at the next explicit use of the secondary table key (lazy update).
到目前为止,我一直使用它从内部 table:
获取特定行LOOP AT it_itab INTO ls_itab WHERE place = 'NEW YORK'.
APPEND ls_itab TO it_anotherItab
INSERT ls_itab INTO TABLE it_anotherItab
ENDLOOP.
但是,对于 7.40,似乎有 REDUCE、FOR、LINES OF 和 FILTER。 FILTER 需要一个排序或散列键,在我的示例中不是这种情况。所以我想只有 FOR 有问题。
DATA(it_anotherItab) = VALUE t_itab( FOR wa IN it_itab WHERE ( place = 'LONDON' )
( col1 = wa-col2 col2 = wa-col3 col3 = ....... ) ).
问题是:
- 两者确实在做同样的事情吗?第二个是 APPEND 还是 INSERT?
- 是否可以在第二个变体中使用整个结构而不指定每一列?就像 ( wa )
- 第二个例子更快吗?
根据您的评论,您还可以在标准 table 上定义一个已排序的辅助键。看看这里的这个例子:
TYPES:
BEGIN OF t_line_s,
name1 TYPE name1,
name2 TYPE name2,
ort01 TYPE ort01,
END OF t_line_s,
t_tab_tt TYPE STANDARD TABLE OF t_line_s
WITH NON-UNIQUE EMPTY KEY
WITH NON-UNIQUE SORTED KEY place_key COMPONENTS ort01. "<<<
DATA(i_data) = VALUE t_tab_tt( ). " fill table with test data
DATA(i_london_only) = FILTER #(
i_data
USING KEY place_key " we want to use the secondary key
WHERE ort01 = CONV #( 'london' ) " stupid conversion rules...
).
" i_london_only contains the filtered entries now
更新:
在我的快速和肮脏的性能测试中,FILTER
在第一次调用时很慢,但之后击败了 LOOP-APPEND
变体。
更新 2:
今天找到原因了...
... the administration of a non-unique secondary table key is updated at the next explicit use of the secondary table key (lazy update).