两表间的数据更新有关问题

两表间的数据更新问题
表A和表B都有test_id字段且该字段的取值完全相同,现在我想将表B中的字段xx1的值更新到表A中,并且同表B一样,A表中xx1的取值和test_id的取值一一对应,我写了以下程序:
alter table A add xx1 varchar2(120);
alter table A add row_id number;
alter table B add row_id number;
update A set row_id=rownum;
update B set row_id=rownum;
//然后利用表A和表B的row_id列将表B的xx1的值更新到xx1中
update  A set xx1=(
      select xx1 from B where B.row_id=A.row_id);
//这个更新倒是没有报错,但更新需要的时间太长了(表B有百万级别的记录)
请教各位大神,有什么办法能优化代码,提高更新速度,拜谢!

------解决方案--------------------
引用:
表A和表B都有test_id字段且该字段的取值完全相同,现在我想将表B中的字段xx1的值更新到表A中,并且同表B一样,A表中xx1的取值和test_id的取值一一对应,我写了以下程序:
alter table A add xx1 varchar2(120);
alter table A add row_id number;
alter table B add row_id number;
update A set row_id=rownum;
update B set row_id=rownum;
//然后利用表A和表B的row_id列将表B的xx1的值更新到xx1中
update  A set xx1=(
      select xx1 from B where B.row_id=A.row_id);
//这个更新倒是没有报错,但更新需要的时间太长了(表B有百万级别的记录)
请教各位大神,有什么办法能优化代码,提高更新速度,拜谢!

用merge into 来试试:
merge into a t1 
using b t2 on (t1.row_id=t2.row_id)
when matched then
update set t1.xx1=t2.xx1


------解决方案--------------------
update A set row_id=rownum;
建议不用用ROWNUM为关联条件去更新,理论上讲每次执行查询,同一条记录对应的ROWNUM有可能不相同
如果这样更新有些值可能会有错误
------解决方案--------------------
直接用test_id为关联条件不行吗?
update /*+ APPEND */  A set xx1=(
      select xx1 from B where B.test_id=A.test_id);
在test_id上建立对应的索引

另外一种方法是用存储过程处理,设置10000?提交一次,批处理,ROWID........
------解决方案--------------------
不知道你的程序是什么逻辑,
你的
update A set row_id=rownum;
update B set row_id=rownum;逻辑上没问题吗?
当然这不是重点,重点是你update比较慢~
表B百万数据应该还好吧,但如果你感觉慢,可以在表B上建一个(row_id,xx1)的索引,这样更新时相对数据量就小很多.
如果还不能满足你性能的要求,去了解一下bulk collect ,forall,批量实现
------解决方案--------------------
不是按test_id更新吗?咋又建了row_id?明显写得语句和需求不一致啊
update  A set xx1=(
      select xx1 from B where B.test_id=A.test_id);

语句本身已经很简洁了,想提升速度只能在数据结构上去优化了,建立索引 或 批量提交