在程序/函数中与高效的DML相关的问题

在程序/函数中与高效的DML相关的问题

问题描述:

当执行DML时,我有两个关于PL/SQL脚本性能的问题。 Ofcourse的EXECUTE IMMEDIATE是最慢的一个这就是为什么我们有forallbulk插入等我的问题是在程序/函数中与高效的DML相关的问题

  1. 我不得不操纵3个不同的表中的数据。 Table1(插入数据),Table2(更新数据)和Table3删除数据。所有这些都将基于使用游标获取的值完成。问题是在这里会更有效率?
    • 将这些陈述中的每一个置于个别Forall区块?即
fetch cursor 
loop 
    forall loop for table 1 
    forall loop for table 2 
    forall loop for table 3 
end loop 

OR

  • 一个全局环和执行这些statments在该循环即
fetch cursor loop 
    for i IN array.count 
    loop 
     3 statements for DML 
    end loop end loop 

现在我的第二个问题

  1. 什么是删除循环记录的有效途径?我通过光标获取要删除的记录的值。现在什么是删除它们的有效方法?

PS: Execuse我格式化

最有效的办法是写三个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集合以及循环以确保收集结果一致。如果这就是你正在做的事情,那么有三条语句会更有效率,因为SQL和PL/SQL引擎之间的上下文移动较少。

在循环中删除记录的有效方法是什么?我通过光标获取要删除的记录的值。现在什么是删除它们的有效方法?

我不确定我是否理解这个问题。难道你只是做一个FORALL循环就像你为INSERTUPDATE

FORALL i IN l_array.first .. l_array.last 
    DELETE FROM some_table 
    WHERE some_key = l_array(i); 

还是想提出一个不同的问题?

+0

这很有帮助。关于'FORALL',我相信* ORACLE10G *没有'bulk' /'bind'选项。它给了错误。到目前为止,oracle 10 g我被迫选择了'FOR'循环。关于删除记录。提取'ROWID'来删除记录或使用'key'比较会更好吗? –

+0

@ x.509 - Oracle 10g当然支持带有DELETE的'FORALL'以及批量绑定。如果您遇到错误,您是否可以编辑您的问题以发布您正在使用的代码以及发生的错误。使用'ROWID'可能比使用'DELETE'上的一个键稍微快一些,但是你可能会在SELECT上失去这个时间,因为大概你需要键而不是'ROWID'来执行'INSERT'和' UPDATE'。 –

+0

贾斯丁,我有一个错误'福尔',但我想通了。 http://www.oracle-developer.net/display.php?id=410 ...现在我很担心表演。 –