首页 > 数据库 > Oracle > 使用merge into优化update关联更新
关联更新顾名思义就是指,更新的数据从关联的表中获取并 update 到目标表。并且该 SQL 将会是一个天然的嵌套循环。
本文介绍如何通过merge into优化改写SQL语句。
下面通过实验来举例优化:
create table a as select * from dba_objects; create table b as select * from dba_objects; insert into b select * from b; ----插入到60w左右数据 ----实验数据构造---- SQL> create table a as select * from dba_objects; 表已创建。 SQL> create table b as select * from dba_objects; 表已创建。 SQL> insert into b select * from b; 已创建 86081 行。 SQL> / 已创建 172162 行。 SQL> / 已创建 344324 行。 SQL> select count(*) from b; COUNT(*) ---------- 688648
现在假设有如下关联更新语句:
update b set b.object_name=(select a.object_name from a where a.object_id=b.object_id); SQL> explain plan for update b set b.object_name=(select a.object_name from a where a.object_id=b.object_id); 已解释。 SQL> set lines 300 pages 300 SQL> select * from table(dbms_xplan.display);
该语句是执行不出来的,CPU都给你干烧了。
------merge into 优化,使用 merge into 一定要注意确保 merge into 的表走全表扫描
alter session set db_file_multiblock_read_count=128;
如果更新的表很大可以开启并行,手动设置
sort
区和
hash
区:
alter session set enable parallel dml; alter session set workarea_size_policy=manual; alter session set sort_area_size=xxx; alter session set hash_area_size=xxx;
下面是使用 merge into 优化该关联更新语句:
merge /*+ use_hash(a,b) parallel(a,4) paraller(b,4)*/ into b using a on (a.object_id=b.object_id) when matched then update set b.object_name=a.object_name;
09:22:42 SQL> merge /*+ use_hash(a,b) parallel(a,4) paraller(b,4)*/ into b using a on (a.object_id=b.object_id) when matched then update set b.object_name=a.object_name; 688640 行已合并。 09:22:54 SQL>
实测用了12s更新完成原先跑不完的update SQL。
以上就是关于对关联更新优化的方法,推荐使用 merge into 的方法去替代update关联更新。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70013625/viewspace-3013110/ ,如需转载,请注明出处,否则将追究法律责任。