认为和你的条件有关。update a set (a.col1,a.col2)=(select b.col1,b.col2 from b where b.col3=a.col3) ,如果你再建一个表C和a相同,也有数据,再执行语句update a set (a.col1,a.col2)=(select b.col1,b.col2 from b,c where b.col3=c.col3)试试看。
哈哈,刚刚回答了一个类似的问题。只好copy一下了。呵呵。update 表1 set 姓名=(select 姓名 from 表2 where 学号=表1.学号)关于这个问题,我昨天回去查了资料,的确执行时间太长,有很好的先例建议修改成:update 表1 set 姓名= decode('A','a','B','b'......),这样的话,效率就会非常的高。update 表1 set 姓名=(select 姓名 from 表2 where 学号=表1.学号) 不仅仅是慢,而且有down掉的可能!呵呵。这个和搂住的问题几乎一样。没想到,这是一个普遍的问题啊!!!
update a set (a.col1,a.col2)=(select b.col1,b.col2 from b where b.col3=a.col3)连where条件也没加,更新的话把所有数据都更新了一遍,会造成更新后结果有误的。
条件有关系,但是UPDATE就没有INSERT 快
所说的方法都已试过,a表中的所有col1,col2 字段都为空而且: select count(*) from a=select count(*) from a,b where a.col3=b.col3; 我试过了对于a是大表b是小表的情况下执行时间比较短,而对于两者都是非常大的表不管建立不建立索引 好像会话已经死锁了。能谈一下死锁的原因和解决之道吗?
只能说你的表一定已经锁住了。 你这样全表的UPDATE,进行中A表是一定被锁的,COMMIT/ROLLBAK后锁才会放掉 你是不是在别的SESSION里面还没有COMMIT?我测试过 a: col3,col1,col2 b: col3,col1,col2 建立复合索引, A:20万(24列) B:40万(24列), update A set (A.col1,A.col2)=(select B.col1,B.col2 from B where B.col3=B.col3) UPDATE 20秒左右。(普通P4台式机512M)
看看执行计划吧。
而且 a 表没有条件限制.
你先看看要修改的a表有多少,
如果少的话,想想如何加条件限制.
换成insert 语句为什么速度变得那么快了,而且也是全表扫描?
我们知道在update a set a.col=..., 在表a上加的是RX锁,是否更这个问题有关?
create index idx_b_123 on b(col1,col2,col3);try!
应该是两个full scan
创建组合索引以后应该是
index scan而且不需要根据rowid来查找数据了。
还是要看一下2个语句的执行计划!!
不仅仅是慢,而且有down掉的可能!呵呵。这个和搂住的问题几乎一样。没想到,这是一个普遍的问题啊!!!
b: col3,col1,col2
建立复合索引,注意把col3放在前面不要把update和select+insert做比较,没什么可比性。
大数据量的UPDATE或DELETE,超过表的一定比例时,不如就建立临时表再RENAMEUPDATE,是慢:)
select count(*) from a=select count(*) from a,b where a.col3=b.col3;
我试过了对于a是大表b是小表的情况下执行时间比较短,而对于两者都是非常大的表不管建立不建立索引
好像会话已经死锁了。能谈一下死锁的原因和解决之道吗?
你这样全表的UPDATE,进行中A表是一定被锁的,COMMIT/ROLLBAK后锁才会放掉
你是不是在别的SESSION里面还没有COMMIT?我测试过
a: col3,col1,col2
b: col3,col1,col2
建立复合索引,
A:20万(24列) B:40万(24列),
update A set (A.col1,A.col2)=(select B.col1,B.col2 from B where B.col3=B.col3)
UPDATE 20秒左右。(普通P4台式机512M)