3

obj_name フィールドに tadir の obj_name フィールドの値とそれに続くワイルドカードが含まれている e071 のすべてのエントリを選択する、恐ろしく遅く非効率的な次のステートメントがあります。

LOOP AT tadir ASSIGNING <fs_tadir>.

   CONCATENATE <fs_tadir>-obj_name '%' INTO gv_obj_name.

    SELECT * FROM e071 APPENDING TABLE gt_e071 
       WHERE obj_name LIKE gv_obj_name.

ENDLOOP.

「For all entry in」または結合で LIKE ステートメントを使用できないため、これをより効率的にする方法はありますか?

4

2 に答える 2

2

LIKE はデータベースにとって非常に恐ろしいものであり、これがループ内にあるため、すべてのループ反復で E071 全体をスキャンする可能性があります。これを入れ替えて、E071 ですべてを選択してから、SELECT...ENDSELECT 内のテーブルをチェックしてください。これは直感に反するように聞こえるかもしれませんが、以前に作成したカスタム REGUH インデックスで私を救ってくれました。

SELECT * FROM e071 APPENDING TABLE gt_e071 
   WHERE obj_name LIKE gv_obj_name.

  READ TABLE tadir WITH KEY.... ASSIGNING <fs_tadir>.

ENDSELECT.

単一の like で選択する代わりに、値の範囲を構築し、それらをまとめて select に送信します。それでもパフォーマンスは低下しますが、改善されます。

data lt_obj_range type range of e071-obj_name.
data ls_obj_range like line of lt_obj_range.

LOOP AT tadir ASSIGNING <fs_tadir>.
   ls_obj_range-sign = 'I'.
   ls_obj_range-option = 'CP'.
   CONCATENATE <fs_tadir>-obj_name '*' INTO ls_obj_range-low.
   append ls_obj_range to lt_obj_range.

endloop.

SELECT * FROM e071 APPENDING TABLE gt_e071 
       WHERE obj_name it lt_obj_range.

DB には select ステートメントのサイズに制限があることに注意してください。範囲内に項目が多すぎる場合は短いダンプが表示されるため、約 200 ~ 300 行の範囲に分割してください。

于 2013-11-02T03:18:54.837 に答える
1

SQL トレース (トランザクションST05) を使用してクエリを分析します。主要な問題の 1 つは、データベースに何千ものクエリを投げる可能性があるという事実を除けば、インデックスをまったく使用しておらず、範囲スキャンを実行していないことです。これにより、おそらく DBMS は数千回のフル テーブル スキャンを実行することになります。と を指定するPGMIDOBJECT、処理速度が大幅に向上します。

また、プレフィックスを使用して、確認しているトランスポート リクエストの数を制限することをお勧めします。システムのいくつかをチェックしたところ、システムの使用年数にもよりますが、エントリの半分はE071トランスポートにまったく属していません。あるシステムでは、4,500 万を超えるエントリのうち 75,000 エントリのみがローカルで作成され、その他はサポート パッケージなどのピース リストです。

以前の質問から、あなたが達成しようとしていることはわかりました。部分オブジェクト名の先頭にあるメイン オブジェクト名に依存できないことに注意してください。汎用モジュールのコーディングをチェックして、TR_CHECK_TYPE部分 ( LIMU) エントリをオブジェクト エントリ全体 ( ) にどのようにマッピングできるかを確認することをお勧めしますR3TR。ただし、逆方向に機能する汎用モジュールは知りません。

SELECT *この段階ではなく、個々のフィールドを選択することについて心配する必要はありません。他の回答やコメントで読み取れる内容とは対照的に、E071フィールドが非常に少ない比較的狭いテーブルであり、クエリには最大のフィールドがすでに必要です。個々のフィールドを選択するだけで得られるものはおそらくほとんどありません。

于 2013-11-01T07:36:33.700 に答える