2016-07-05 76 views
0

我正在寻找更有效的方式来循环PLSQL。PLSQL中更高效的循环

要求:想象我有BudgetTable & RuleSet表。 规则集看起来是这样的:

acc | loc | proj || rule1 | tag1 | prio 
A1% | L1% | P2% || direct | all | 90 
A12% | L12% | P23% || spread | alloc | 50 

第3列是低于BudgetTable键where子句,并存储在列的其余..

A123 | L123 | P234 
A199 | L199 | P299 

和被拾起的记录对于每次循环迭代

LOOP1:(A1%| L1%| P2%||直接|全部| 90)

A123 | L123 | P234 || direct | all | 90 
A199 | L199 | P299 || direct | all | 90 

loop2:(A12%| L12%| P22%||传播| alloc | 50)

A123 | L123 | P234 || spread | alloc | 50 

我做了最直接的方法,通过遍历RuleSet表。

(pseudocodes) 
FOR r in (select acc,loc,proj,rule1,tag1,prio from RuleSet) 
LOOP 
    INSERT INTO ResultTable 
    select [columns, rule, tag1,prio ] 
    from BudgetTable 
    where acc like r.acc 
     and loc like r.loc 
     and proj like r.proj 
     ; 
END LOOP; 

我在寻找更好的方法来做到这一点。问题是Rul​​eSet可以包含数千条规则,因此通过逐个匹配记录的迭代可能会很漫长。我想知道是否有可能打破几个并行流中的循环&同时运行它们.. 感谢您的输入..

+0

感谢名单的所有谁回答.. ,我能够来测试方法。 (1)与for循环(2)交叉连接。好奇地,与预算表abt 10Mil行,规则约100k,我原来的方法与循环更快。 我的理论是,当处理大量的行时,oracle不得不交换/溢出到它的重做日志中(或者是归档日志?)。 – handitri

回答

4

使用简单的INSERT + SELECT + JOIN,它应该比你的循环快30〜50倍:

INSERT INTO ResultTable 
SELECT b.columns, b.rule, b.tag1,prio 
FROM BudgetTable b 
JOIN RuleSet r 
ON b.acc like r.acc 
    and b.loc like r.loc 
    and b.proj like r.proj 
2

也许你并不需要一个循环都:所以今天

INSERT INTO ResultTable 
select [columns, rule, tag1,prio ] 
from BudgetTable bt 
cross join RuleSet rs 
where bt.acc like rs.acc 
    and bt.loc like rs.loc 
    and bt.proj like rs.proj 
    ; 
+0

Thanx指示我交叉连接。 – handitri

+0

如果规则集的顺序是10k行,而预算表的顺序是20mil行,会不会交叉使用过多的db资源?而循环会允许频繁提交点 – handitri

+0

我想重要的数字将是多少行通常最终被插入。如果这是数以百万计的话,那么一次去做可能太多了。另一方面,如果您定期提交,最终可能会插入一些数据,有些则不会。 –