我有两个选项可以根据选择查询的光标更新表。
说我有这个选择查询:
select id1 from table1
我的更新查询是:
update table2 set value=1 where table2.id2 = table1.id1
现在有两个选项:
将游标设置为select查询并批量获取,然后在for all语句中触发更新查询。
使用select子查询编写更新查询:
更新table2 set value = 1其中table2.id2 in(从table1中选择id1)
哪一个更好?
Oracle是否在内部将select子查询转换为批量收集,还是将其视为普通游标?
答案 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
条款)