oracle海量更新如何优化

Gha*_*ine 3 sql oracle sql-optimization sql-update

我需要更新 oracle 中包含 ~40*10^6 记录的巨大表。将修改的行数约为 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
Run Code Online (Sandbox Code Playgroud)

现在为了进行更新,我需要添加另一个联接或使用IN语句,这将使事情变得更糟。

有没有办法并行化这个?或者进行批量更新(每次更新25*10^4行)?有没有办法告诉oracle只更新前n行?然后 n->2n,然后 2n->3n ...?

该脚本将在生产环境中运行,因此表重建不是替代方案。

更新包括将布尔列设置为 true。(如果这有帮助)

Jon*_*ler 5

执行大规模更新的最快方法是使用并行 DML,如下所示:

alter session enable parallel dml;
update /*+ parallel(16) */ some_table set some_column = 1;
commit;
Run Code Online (Sandbox Code Playgroud)

有很多小问题需要注意。您需要有企业版。他们UPDATE将获得表上的独占锁,因此其他人无法同时写入该表。您的系统必须有足够的资源来支持大型数据库UPDATE,例如足够的重做、撤消、CPU、I/O 和配置合理的系统。

(您可能希望将我的示例中的数字 16 更改为适合您的系统的数字。如果您想最大限度地提高性能,但可能会牺牲其他进程,请将数字设置为等于核心数量。 )

Oracle 并行性很棒,但并没有真正优化。它让系统更加努力地工作,而不是更加智能。在尝试并行性之前,您可能需要查看UPDATE. 您可能还想尝试使用MERGE。语法MERGE一开始有点棘手,但它可以帮助避免重复连接,并允许散列连接,它可以更快地更改大部分行。