首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与过程/功能中的高效DML相关的问题

问与过程/功能中的高效DML相关的问题
EN

Stack Overflow用户
提问于 2011-12-01 18:51:53
回答 1查看 155关注 0票数 1

在执行DML时,我有两个关于PL/SQL脚本性能的问题。当然,EXECUTE IMMEDIATE是最慢的,这就是为什么我们有forall、bulk插入等等。

  1. 我必须在3个不同的表中操作数据。Table1 (插入数据)、Table2(更新数据)和Table3删除数据。所有这些都将基于使用游标获取的值来完成。问题是,在这里什么更有效?
    • 将这些语句放在单独的Forall块中?即

​

表1的

获取游标循环、表2的forall循环、表3端循环的forall循环

或

  • 是一个全局循环,并在该循环中执行这些状态,即

用于I的

获取游标循环在array.count循环中的3条语句用于array.count末端循环

现在我的第二个问题

  1. 循环中删除记录的有效方法是什么?我通过游标获取要删除的记录的值。那么,删除它们的有效方法是什么呢?

P.S:删除我的格式

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-01 19:02:59

最有效的方法是编写三条SQL语句,假设从游标获取的数据在运行过程的时间内是稳定的。

代码语言:javascript
复制
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吗

代码语言:javascript
复制
FORALL i IN l_array.first .. l_array.last
  DELETE FROM some_table
   WHERE some_key = l_array(i);

还是你问的是不同的问题?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8346684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档