在执行DML时,我有两个关于PL/SQL脚本性能的问题。当然,EXECUTE IMMEDIATE是最慢的,这就是为什么我们有forall、bulk插入等等。
Table1 (插入数据)、Table2(更新数据)和Table3删除数据。所有这些都将基于使用游标获取的值来完成。问题是,在这里什么更有效?Forall块中?即
表1的
获取游标循环、表2的forall循环、表3端循环的forall循环
或
用于I的
获取游标循环在array.count循环中的3条语句用于array.count末端循环
现在我的第二个问题
P.S:删除我的格式
发布于 2011-12-01 19:02:59
最有效的方法是编写三条SQL语句,假设从游标获取的数据在运行过程的时间内是稳定的。
INSERT INTO table1( list_of_columns )
<<your SELECT statement>>
UPDATE table2
SET (<<list of columns>>) = (<<your SELECT statement joined to table2>>)
WHERE EXISTS( <<your SELECT statement joined to table2>> );
DELETE FROM table3
WHERE EXISTS( <<your SELECT statement joined to table3>> );如果SELECT语句可能会在三个DML语句中返回不同的结果,那么接受使用游标、将数据批量收集到PL/SQL集合并遍历集合以确保结果一致的性能影响是有意义的。如果这就是您所要做的,那么使用三条FORALL语句将更有效,因为这将减少SQL和PL/SQL引擎之间的上下文转移。
循环中删除记录的有效方法是什么?我通过游标获取要删除的记录的值。那么,删除它们的有效方法是什么呢?
我不太明白这个问题。你不就像做一个FORALL循环那样做INSERT或UPDATE吗
FORALL i IN l_array.first .. l_array.last
DELETE FROM some_table
WHERE some_key = l_array(i);还是你问的是不同的问题?
https://stackoverflow.com/questions/8346684
复制相似问题