web-dev-qa-db-ja.com

ABAP7.40 +構文を使用した最も効率的なitabフィルタリング

リリース7.40では、内部テーブルデータをフィルタリングする方法がたくさんあります。たとえば、次のようなABAP構造を使用できます。

[〜#〜] filter [〜#〜] 演算子

DATA(lt_extract) =
  FILTER #( lt_bseg USING KEY matnr_bwtar WHERE matnr = CONV matnr( SPACE ) 
                                            AND bwtar = CONV bwtar( SPACE ) ).

[〜#〜] for [〜#〜] テーブルの反復 [〜#〜] value [〜#〜] 構築演算子

DATA(lt_extract) = 
 VALUE tty_bseg( FOR line IN lt_bseg WHERE ( matnr EQ SPACE AND bwtar EQ SPACE ) ( line ) ).

パフォーマンスが向上する理由は何ですか?

内部テーブルのフィルタリングを効率的に実行するための他の構文を知っているかもしれませんか?

7
Suncatcher

ウェブ上でベンチマークは見つかりませんでしたが、自分でテストするのはとても簡単です。

そのタスクに特化したFILTERは、他の多くの可能な操作から選択するためのオーバーヘッドコストがある他の構成よりも高速であるというのは論理です。

FILTERには、開発者にインデックスの使用を強制するという利点もあります。もちろん、インデックスの作成にはそれ自体にコストがかかるため、インデックスの使用と実行されるフィルタリングの量のバランスをとる必要があります。

ABAPドキュメント7.52は、FILTERのパフォーマンスと、それを使用しない場合の推奨事項を詳しく説明しています( https://help.sap.com/http.svc/rc/abapdocu_752_index_htm/7.52/en-US/index.htm? file = abenconstructor_expression_filter.htm ):

テーブルフィルタリングは、テーブル内包表記またはFORを使用したテーブル反復の反復式を使用したテーブル削減を使用して実行することもできます。演算子FILTERは、この特殊なケースの短縮形式を提供し、の実行がより効率的です

テーブルフィルターは、結果を行ごとに作成します。結果にソーステーブルのほぼすべての行が含まれている場合、このメソッドは、ソーステーブルをコピーしてターゲットテーブルから余分な行を削除するよりも遅くなる可能性があります。

6
Sandra Rossi