ITPub博客

首页 > 数据库 > Oracle > 使用merge into优化update关联更新

使用merge into优化update关联更新

原创 Oracle 作者:a960549548 时间:2024-04-19 15:20:00 0 删除 编辑

关联更新顾名思义就是指,更新的数据从关联的表中获取并 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);

TABLE OUTPUT  Plan hash value: 1833715393  Operation  UPDATE  UPDATE  TABLE ACCESS FULL  IWEX FULL scm•l  Name  IDX A  Rows  587K  587K  742  s cost (%CPLI) Time  44M  44M  58618  300M  2216  511  Predicate Information (identified by  access ("A  . 'OBJECT_ID  filter ("A .  'OBJECT_ID  operation id) :

 该语句是执行不出来的,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;

SQL) explain plan for merge use _ hash (a, b) parallel (a, 4) paraller (b, into b using a on (a. object _  SQL) select * from table (dbms_xplan.  TABLE OUTPUT  Plan hash value: 44347277  Operation  MERGE  MERGE  PX COORDINATOR  di spl ay)  Name  :TQ10002  :TQIOOOI  :TQIOOOO  cost (%CPLI)  Time  IIN-OLITI PO Distrib  4  10  11  12  13  PX SEW QC (RANDOM)  VIEW  HASH JOIN  PX RECENÆ  PX SEW HASH  PX BLOCK ITERATOR  TABLE ACCESS FULL  BUFFER SORT  PX RECENÆ  PX SEW HASH  TABLE ACCESS FULL  680K  680K  680K  86080  86080  86080  86080  688K  688K  688K  59M  8238K  8238K  8238K  8238K  64M  64M  64M  2298  2298  2298  77  77  77  77  2221  2221  2221  (1)  (1)  (1)  (0)  (0)  (0)  (0)  (1)  (1)  (1)  p->S  PCWP  PCWP  PCWP  PCWC  PCWP  PCWC  PCWP  s->P  QC (RAND)  HASH  HASH  Predicate Information (identified by operation  access "OBJECT_ID  = 'B . 'OBJECT_ID")

 

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE,MySQL 8.0 OCP,PMP,拥有OceanBase OBCP,TiDB PCTP,GoldenDB GDCP等多项认证,ITPUB认证专家,微信公众号:DBA之友。

注册时间:2022-02-08

  • 博文量
    132
  • 访问量
    171520