2016-05-01 29 views
2

私の内部テーブルには多くのデータが含まれています。 私は、次のコードを持っている:このABAPコードのパフォーマンスを最適化する方法

LOOP AT lt_tab INTO ls_tab 
    WHERE ((value1 EQ lv_id1) AND 
    (value2 LE lv_id2 AND value3 GE lv_id3)). 

    IF ls_tab-value4 IS NOT INITIAL. 
    IF ls_tab-value4 NE lv_var. 
     lv_flag = lc_var. 
     EXIT. 
    ENDIF. 
    ELSE. 
    lv_flag = lc_var. 
    EXIT. 
    ENDIF. 
ENDLOOP. 

データベーステーブルは7つのフィールドを含み、内部テーブルは、データベーステーブルのような同じタイプを有します。 where句には、主キーフィールドはありません。テーブルには、2つの主キーで構成される複合キーがあります。テーブルフィールドはtransid(主キー)、item1(主キー)、value1value2,value3およびvalue4です。私はそれらの条件に基づいてテーブルを検索しなければなりません。しかし、これは時間がかかり過ぎている。私はABAPの新機能です。このコードを最適化するのを助けてください。

+3

これは完全なコードではありません。問題のテーブルの構造とともに、完全な例を投稿してください。 – vwegert

+0

ループ文を最適化するにはどうすればよいですか? –

+0

if文を単純化し、 'INTO'の代わりに' ASSIGNING'を使うことができますが、それはあなたに非常に優れた利点を与えません。実際のターゲットとより多くのコードは役に立ちます –

答えて

0

実際の問題点を完全に把握するために十分な情報を提供していないにもかかわらず、ループの状態でキー以外のフィールドを使用しているため、パフォーマンスの問題が発生している可能性があります。

LOOP AT lt_tab INTO ls_tab 
    WHERE ((value1 EQ lv_id1) AND 
    (value2 LE lv_id2 AND value3 GE lv_id3)). 

あなたはフィールドvalue1value2value3を含んでいるでしょう変数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です。

0

LOOP AT ... ASSIGNING (<fieldsymbol>)を使用できます。 割り当てはLOOP AT ... INTO structureよりも効果的です。 Hereさらに詳しい情報

+1

これは、 'INTO'で使われた構造体が複雑で、さもなければそれほど利益はあまりありません。 – Jagger

0

多くのデータがある場合は、コードの行を少し速くするのに役立ちません。

おそらく、完全なテーブルスキャンを行っている可能性があります。あなたがそれらを使用する場合は

http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb366d358411d1829f0000e829fbfe/content.htm

:あなたは、テーブルの各行この種の問題のために

(あなたが探しているものを見つけるまで)、そこにテーブルをソートし、ハッシュ化されたテーブルを処理しています賢明には、selectは、テーブル内のデータの分布に応じて、複数のより速い選択をもたらす、テーブル内の一部の行だけをチェックする必要があります。

0

この場合、我々はを必要とし、大量のデータの場合のパフォーマンスを改善するために代わりSTANDARD内部テーブル(デフォルト動作)の内部テーブルソート。内部テーブルのあなたのケースではまあ

DATA: lt_sorted_data TYPE SORTED TABLE OF TABLENAME WITH NON-UNIQUE KEY MTART. 

TABLENAMEは、我々が持つ別の(ローカル)構造を作成する必要があり、すでに主キーを含むデータベーステーブルには、すでにあるので、の定義の

例同じ列リスト、そしてそれが速くログ(N)基礎であろう

select * into CORRESPONDING FIELDS OF TABLE lt_sorted_data 

を介してデータをロードします。

+0

ありがとうございます。それは本当に私をたくさん助けました。 –

関連する問題