急:简单的update优化

bean_sql 2012-04-17 08:14:57
有如下两张表 :
a表:
CustomerID varchar2(10),
Vparameters varchar2(10),
Is_Pay char(1)

b表:
CustomerID varchar2(10),
Vparameters varchar2(10),
Is_Pay char(1)

关联条件
a.CustomerID=b.CustomerID 
and a.Vparameters=b.Vparameters

更新语句:

update a set a.is_pay=(select b.is_pay from b
where b.CustomeriD=a.CustomerID
and b.Vparameters=a.Vparameters)
--由于a,b两张表都有三千万条数据,这样写肯定要更新一晚上,请问有什么好的写法

...全文
135 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zaghost 2012-12-24
  • 打赏
  • 举报
回复
引用 4 楼 mg_chen 的回复:
create table ttt as select a.col1,b.ispay,a.col2,.... where b.CustomeriD=a.CustomerID and b.Vparameters=a.Vparameters; drop table a; rename table ttt to a;
这个a表中不相等的数据没有复制过来
Wendy00100 2012-04-18
  • 打赏
  • 举报
回复

--method1:
create table tmp
as
select a.CustomerID,a.Vparameters,case when b.is_pay is null then a.is_pay else b.is_pay end is_pay
from a
left outer join b
on b.CustomeriD=a.CustomerID
and b.Vparameters=a.Vparameters;
drop table a;
create table a
as
select * from tmp;
--method2:
merge into a
using b
on (b.CustomeriD=a.CustomerID
and b.Vparameters=a.Vparameters)
when matched then
update set a.is_pay=b.is_pay;

没测试过
lxyzxq2008 2012-04-17
  • 打赏
  • 举报
回复
只是去掉索引,应该不会提高太多性能,
官方给出的解决方法如下:
1.利用CREATE table as select xxxxx的办法来生成一新表T1

  2.在T1上创建与目标表一样的索引

  3.把目标表删除或RENAME(注意备份以备反悔)

  4.把T1改名成目标表
bayueguihuaxiang 2012-04-17
  • 打赏
  • 举报
回复
结果不是两个表中数据都一样吗?不如直接删除a表,然后创建a表

create table a
nologging
parallel n
as
select * from b;

Define_ling 2012-04-17
  • 打赏
  • 举报
回复
能不能这样:
select is_pay,CustomerID,Vparameters from a
rs(rs.next){
"update a set a.is_pay=(select b.is_pay from b where b.CustomeriDand='"+rs.getString(2)+"' and b.Vparameters='"+rs.getString(3)+"')"
}
先查询出来,在进更新,后面更新时就不是两张表联合查询子集
APHY 2012-04-17
  • 打赏
  • 举报
回复

--如果此表建索引了,可以在更新操作前,删除索引,更新完成后,在重建索引。
update t1 set t1.is_payt2.is_pay
from a t1,b t2
where t1.CustomeriD=t2.CustomerID and t1.Vparameters=t2.Vparameters

--也可以使用分区技术,对多个分区并行update操作以提升效率,但是系统的压力也会随之增大。
mg_chen 2012-04-17
  • 打赏
  • 举报
回复
create table ttt
as
select a.col1,b.ispay,a.col2,....
where b.CustomeriD=a.CustomerID and b.Vparameters=a.Vparameters;

drop table a;
rename table ttt to a;

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧