0

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

假设我有这个选择查询:

select id1 from table1

我的更新查询是:

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

现在有两个选项:

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

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

    update table2 set value=1 where table2.id2 in (select id1 from table1)

哪一个更好?

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

4

1 回答 1

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(根据您的需要添加子句)

于 2012-08-31T11:16:26.027 回答