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); 语句本身已经很简洁了,想提升速度只能在数据结构上去优化了,建立索引 或 批量提交
建议不用用ROWNUM为关联条件去更新,理论上讲每次执行查询,同一条记录对应的ROWNUM有可能不相同
如果这样更新有些值可能会有错误
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,批量实现
update A set xx1=(
select xx1 from B where B.test_id=A.test_id);
语句本身已经很简洁了,想提升速度只能在数据结构上去优化了,建立索引 或 批量提交
两条记录中可能会出现test_id一样,而xx1的取值不一样的情况,如果按test_id更新的话,可能更新的结果会出错