ORACLE 使用关联更新做update 优化方案

ORACLE 使用关联更新做update 优化方案

**

ORACLE数据库关系更新/修改 优化方案

–感谢您在百忙之中,来捧场,笔者有什么不对的地方,感谢您的纠正。
我们可以做个实验去验证一下
这里我们使用的是scott测试账户,方便教学。

create table t1 as select * from dba_objects;
create table t2 as select * from dba_objects;

–创建需要的话需要DBA的权限,大家提示表或视图不存在的,可以登录

自己的sysdba账户,给自己的scott账户授权。
要求:使用关联更新的方式,去做修改/更新
1、 用关联更新的方法 将t1的数据还原?

第一种:
update t1
set t1.owner = (select t2.owner
from t2
where t1.object_id = t2.object_id);

这里的object_id是一个主键。
大家可以去运行一下,一般设备都需要5分钟左右,性能很差,如果表再大一些的话,就完全不行了。
那么问题来了,我们就需要去优化他,提高性能。
优化方案
第一种:比较简单,适用于返回值比较少,(小表)—创建索引

create index idx_objectid on t2(object_id);
update t1
set t1.owner = (select t2.owner
from t2
where t1.object_id = t2.object_id);

–创建索引之后,可以重新运行一下,基本是秒修改的。

第二种:可以使用比较简单的merge into语句,很常用

merge into t1
using t2
on (t1.object_id = t2.object_id)
when matched then
update set t1.owner=t2.owner;
when not matched then
insert
values
(t2.owner, t2.object_name, t2.subobject_name, t2.object_id, t2.data_object_id, t2.object_type,  t2.created, t2.last_ddl_time, t2.timestamp, t2.status, t2.temporary, t2.generated, t2.secondary,  t2.namespace, t2.edition_name);

—这种方法也是秒更新。

除了这两种,还可以使用游标去做更新
1、单行游标

declare
cursor cur_update is
select t1.object_id,t2.object_id,t1.rowid rid
from t1,t2
where t1.object_id = t2.object_id
order by rowid;
ln_cnt number;
begin
ln_cnt :=0;
for x in … cur_update loop
update t1
set t1.owner = t2.owner
where rowid = x.rid
ln_cnt :=ln_cnt + 1;
if (ln_cnt >= 2000) then
commit;
end if;
ln_cnt :=0;
end loop;
commit;
end;

作者:wang6596639
来源:CSDN
原文:https://blog.csdn.net/wang6596639/article/details/83963720
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(优化更新案例)