0

既存の注文リストに対して製品を割り当てる手続きを行っています。

For rec_ord in(Select Order_ID,Order_Prop1,Order_Prop2,<some more columns> 
               from Order_Master Where <Some Conditions>)
Loop
<Step-1:Do some Processing on Order_Prop1,Order_Prop2>
[Log the Processing Result]
For rec_prod in (Select Prod_ID,Prod_Prop1,Prod_Prop2,<some more columns> 
                 from Product_Master 
                 Where Prod_Prop1 = Ord_Prop1
                 and <Some Conditions>)
Loop
<Step-2:Do Some Processing using Prod_Prop2 and Order_Prop2>
[Log the Processing Result]
<Decide Whether to Assign or Not>
[Log the assignment or non-assignment with reason]
End Loop
End Loop

以下の2つの方法を試しました。

  1. Bulk Collect:I Order_Master と Product_Master を結合して、ステップ 1 と 2 を 1 つのクエリに結合しました。次に、Bulk-Collect を使用して割り当てを挿入します。ただし、個々のレコードのログと追跡が失われています。
  2. For ループ: 上記のように For ループを使用しました。しかし、これには時間がかかりすぎます。実行時間を何倍にも増やします。

ロギングと追跡とともに、処理を高速にしたいと考えています。どんな助けでも大歓迎です。

事前にサンクス。

4

1 に答える 1

0

私にとって、ここでの問題は、大量の行の処理と単一行のロギングを組み合わせようとしていることのようです。Oracle は PL/SQL と SQL エンジンを絶えず切り替える必要があるため、これはパフォーマンスの低下につながります。

したがって、実行可能な解決策は、ロギング情報を配列に収集TYPE t_logs IS TABLE OF reasonable_rec_log_typeし、予想されるテーブルの次元に応じて、一度に、または時々 (外側のループで?) チャンクでロギング プロシージャに渡すことです。

一括収集ソリューションを決定する場合、プロシージャを呼び出すときに速度が向上しないため、自分でログを記録するために挿入を行った場合、FORALL (複数回) を使用することも可能です。一度に 1 行ずつ実行し、それらをまとめて実行します。

于 2016-11-12T20:59:39.303 に答える