我需要更新一个包含约40*10^6条记录的Oracle大表。 将被修改的行数大约为10^7。 确定要更新的行的查询很复杂,涉及连接。仅查找将被更新的行的ID就需要30分钟。
Select p.some_id from
(select some_id, col2,col3 from t1 where col2='someVulue' and col3 ='someValue') p
inner join (select some_id from t2 where t2.col3='someValue') q
on p.some_id=q.some_id
现在为了进行更新,我需要添加另一个join或使用IN语句,这将使事情更加糟糕。有没有一种方法可以并行化此过程?或者进行批量更新(每次更新25 * 10 ^ 4行)?有没有一种方法告诉Oracle仅更新前n行?然后是n->2n,然后是2n->3n...?脚本将在生产环境上运行,因此表重建不是可行的选择。更新包括将布尔列设置为true。(如果这有助于理解)
select
查询。我认为我理解了in
子查询的问题,Jon Heller 的merge
建议可能会有所帮助,或者是update (select...join...) set...
,然后还有dbms_parallel_execute
或纯粹的/*+ parallel */
用于并行方面。 - William Robertson