ABAP LOOP文の高速化(失敗)

  アドオンプログラム

概要

LOOP文はBINARY SEARCHのような検索オプションが存在しない為、パフォーマンスがネックになる事がある。
一度BINARY SEARCHを使用したREAD TABLEを行い検索条件の先頭行を取得し、LOOP文の検索開始をその行から
行うようにする事でパフォーマンス向上に繋がる。

サンプルコード:LOOP文の高速化

data: it_ltak type table of ltak,
      it_ltap type table of ltap,
      it_ltap_desc type table of ltap,
      wa_ltak type ltak,
      wa_ltap type ltap,
      v_from type sy-tabix,
      v_to type sy-tabix.

select * into table it_ltak from ltak.
sort it_ltak by LGNUM TANUM.
select * into table it_ltap from ltap.
sort it_ltap by LGNUM TANUM.

Loop at it_ltak into wa_ltak.

  read table it_ltap transporting no fields
  with key LGNUM = wa_ltak-LGNUM
           TANUM = wa_ltak-TANUM
  binary search.
  v_from = sy-tabix.

  loop at it_ltap into wa_ltap from v_from
    where LGNUM = wa_ltak-LGNUM
      and TANUM = wa_ltak-TANUM.
***** Process *****
  endloop.

endloop.

説明

まず最初に、LTAK・LTAPからデータを取得しているが、これはテストデータの取得の為なのでどのようなテーブルでも問題ない。
取得後に主キーでソートを行う。BINARY SEARCHを使用する為に並び順は非常に重要なので忘れず行うようにしよう。
そしてLTAKのループ内でREAD TABLEを使ってLTAPの開始行を取得するが、項目の値を取得する必要はないのでTRANSPORTING NO FIELDSオプションを使用する。
開始行がシステム変数:SY-TABIXに入っているのでその値を別の変数に移しておく。
次に、LTAPのLOOP文を使用する際にFROM 開始行のオプションをつける。これでLOOP文は開始行以降の検索しか行わないようになる。
このような処理を入れる事でLOOP文の検索件数が減る為、パフォーマンス向上に繋がる事になる。
同様にTO 終了行のオプションも存在する。1万件程度の内部テーブルであればFROMのみの方がパフォーマンスは良い。

追記

さらに大量データを使用した場合、当処理ではパフォーマンスが良くない事に気づいた。内部テーブルのパフォーマンス検証:大量データをBINARY SEARCHで検索を確認してもっとも良い書き方を選んで頂きたい。