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. 批量收集:我通过加入 Order_Master 和 Product_Master 将步骤 1 和 2 合并到单个查询中。然后使用 Bulk-Collect 插入作业。但是我失去了个人记录的记录和跟踪。
  2. For 循环:我使用了上面给出的 For 循环。但这需要的时间太长了。多次增加我的执行时间。

我希望处理速度与日志记录和跟踪一起快速。任何帮助表示赞赏。

提前谢谢。

4

1 回答 1

0

对我来说,这里的问题似乎是您尝试将大量行处理与单行日志记录结合起来。这导致性能非常差,因为 Oracle 必须不断在 PL/SQL 和 SQL 引擎之间切换

因此,一个可行的解决方案是将日志信息收集到一个数组中TYPE t_logs IS TABLE OF reasonable_rec_log_type,然后一次或不时地将其传递给日志记录过程(在外部循环中?),具体取决于预期的表尺寸。

如果您决定使用批量收集解决方案,如果您自己进行了插入记录,那么使用 FORALL(多次)也是可能的,因为它在调用过程时不会加快速度 - 它的目的是生成本来可以执行的DML 语句一次执行一行并完全执行它们。

于 2016-11-12T20:59:39.303 回答