Oracle批量通过选择子查询从游标或用户更新收集和更新

时间:2012-08-31 11:01:03

标签: oracle oracle10g

我有两个选项可以根据选择查询的光标更新表。

说我有这个选择查询:

select id1 from table1

我的更新查询是:

update table2 set value=1 where table2.id2 = table1.id1

现在有两个选项:

  1. 将游标设置为select查询并批量获取,然后在for all语句中触发更新查询。

  2. 使用select子查询编写更新查询:

    更新table2 set value = 1其中table2.id2 in(从table1中选择id1)

  3. 哪一个更好?

    Oracle是否在内部将select子查询转换为批量收集,还是将其视为普通游标?

1 个答案:

答案 0 :(得分:1)

首先在您的问题上“Oracle是否在内部将选择子查询转换为批量收集?”
否。优化程序计算计划并以某种适当的方式从子查询中选择数据。没有涉及大量收集。

对于你的问题“哪一个更好?”。这得看情况。如果您可以制定一个查询,在一次运行中获取所有table1.id1 并且 table2有很多行,因此子选择昂贵,那么我可能使用批量收集。但请记住,根据数据量,您需要一些PGA来完成此任务。

但我可能指向另一个 - 恕我直言,相当优雅 - 解决方案:

MERGE INTO table2
  USING (select id1 from table1)
   ON (id2 = id2)
  WHEN MATCHED THEN 
   UPDATE SET value=1
;

这通常比执行子查询更快,而且比批量收集更快:一个在table1上运行,一个在table2上运行。 (根据您的需要添加where条款)