実際の問題点を完全に把握するために十分な情報を提供していないにもかかわらず、ループの状態でキー以外のフィールドを使用しているため、パフォーマンスの問題が発生している可能性があります。
LOOP AT lt_tab INTO ls_tab
WHERE ((value1 EQ lv_id1) AND
(value2 LE lv_id2 AND value3 GE lv_id3)).
あなたはフィールドvalue1
、value2
とvalue3
を含んでいるでしょう変数lt_tab
のテーブルタイプのセカンダリソートキーを定義することができます。
次の例を参照してください。
REPORT zzy.
CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
PUBLIC SECTION.
CLASS-METHODS:
class_constructor,
main.
PRIVATE SECTION.
TYPES: BEGIN OF t_record,
transid TYPE sy-index,
item1 TYPE char20,
value1 TYPE p LENGTH 7 DECIMALS 2,
value2 TYPE p LENGTH 7 DECIMALS 2,
value3 TYPE p LENGTH 7 DECIMALS 2,
value4 TYPE p LENGTH 7 DECIMALS 2,
END OF t_record,
tt_record TYPE STANDARD TABLE OF t_record WITH NON-UNIQUE KEY transid item1.
* tt_record TYPE STANDARD TABLE OF t_record WITH NON-UNIQUE KEY transid item1 WITH UNIQUE SORTED KEY sec_key COMPONENTS value1 value2 value3.
CONSTANTS:
mc_value1 TYPE p LENGTH 7 DECIMALS 2 VALUE '100.00',
mc_value2 TYPE p LENGTH 7 DECIMALS 2 VALUE '150.00',
mc_value3 TYPE p LENGTH 7 DECIMALS 2 VALUE '10.0'.
CLASS-DATA:
mt_record TYPE tt_record.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION.
METHOD class_constructor.
DO 2000000 TIMES.
INSERT VALUE t_record(transid = sy-index item1 = |Item{ sy-index }| value1 = sy-index value2 = sy-index/2 value3 = sy-index/4 value4 = 0)
INTO TABLE mt_record.
ENDDO.
ENDMETHOD.
METHOD main.
DATA:
l_start TYPE timestampl,
l_end TYPE timestampl,
l_diff LIKE l_start.
GET TIME STAMP FIELD l_start.
LOOP AT mt_record INTO DATA(ls_record) "USING KEY sec_key
WHERE value1 = mc_value1 AND value2 >= mc_value2 AND value3 <= mc_value3.
ASSERT 1 = 1.
ENDLOOP.
GET TIME STAMP FIELD l_end.
l_diff = l_end - l_start.
WRITE:/l_diff.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_main=>main().
テーブルタイプtt_record
は、次のよう
tt_record TYPE STANDARD TABLE OF t_record WITH NON-UNIQUE KEY transid item1.
で定義されている場合は、私のSAPシステム上のループの実行時間が0.156
から0.266
秒まで変化します。
あなたは
tt_record TYPE STANDARD TABLE OF t_record WITH NON-UNIQUE KEY transid item1 WITH UNIQUE SORTED KEY sec_key COMPONENTS value1 value2 value3.
を次のようにしかし、それを定義し、ヒントUSING KEY sec_key
を追加することにより、ループを調整した場合、私は毎回取得する実行時間が0.00
です。
これは完全なコードではありません。問題のテーブルの構造とともに、完全な例を投稿してください。 – vwegert
ループ文を最適化するにはどうすればよいですか? –
if文を単純化し、 'INTO'の代わりに' ASSIGNING'を使うことができますが、それはあなたに非常に優れた利点を与えません。実際のターゲットとより多くのコードは役に立ちます –