在程序/函数中与高效的DML相关的问题
问题描述:
当执行DML时,我有两个关于PL/SQL脚本性能的问题。 Ofcourse的EXECUTE IMMEDIATE
是最慢的一个这就是为什么我们有forall
,bulk
插入等我的问题是在程序/函数中与高效的DML相关的问题
- 我不得不操纵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
现在我的第二个问题
- 什么是删除循环记录的有效途径?我通过光标获取要删除的记录的值。现在什么是删除它们的有效方法?
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
循环就像你为INSERT
或UPDATE
FORALL i IN l_array.first .. l_array.last
DELETE FROM some_table
WHERE some_key = l_array(i);
还是想提出一个不同的问题?
这很有帮助。关于'FORALL',我相信* ORACLE10G *没有'bulk' /'bind'选项。它给了错误。到目前为止,oracle 10 g我被迫选择了'FOR'循环。关于删除记录。提取'ROWID'来删除记录或使用'key'比较会更好吗? –
@ x.509 - Oracle 10g当然支持带有DELETE的'FORALL'以及批量绑定。如果您遇到错误,您是否可以编辑您的问题以发布您正在使用的代码以及发生的错误。使用'ROWID'可能比使用'DELETE'上的一个键稍微快一些,但是你可能会在SELECT上失去这个时间,因为大概你需要键而不是'ROWID'来执行'INSERT'和' UPDATE'。 –
贾斯丁,我有一个错误'福尔',但我想通了。 http://www.oracle-developer.net/display.php?id=410 ...现在我很担心表演。 –