认为和你的条件有关。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)试试看。

解决方案 »

  1.   

    不同的写法,update a set a.col1=b.col1,a.col2=b.col2 where a.col3=b.col3
    看看执行计划吧。
      

  2.   

    糗大了!俺准备洗脑。重新学习oracle。楼主,上面的你就别看了。呜呜。
      

  3.   

    update  a set (a.col1,a.col2)=(select b.col1,b.col2 from b where b.col3=a.col3)这种SQL肯定慢,两个表都是全表扫描,
    而且 a 表没有条件限制.
    你先看看要修改的a表有多少,
    如果少的话,想想如何加条件限制.
      

  4.   

    可不可能是数据库配置的问题?
    换成insert 语句为什么速度变得那么快了,而且也是全表扫描?
    我们知道在update a set a.col=..., 在表a上加的是RX锁,是否更这个问题有关?
      

  5.   

    建议创建组合索引!
    create index idx_b_123 on b(col1,col2,col3);try!
      

  6.   

    看一下执行计划
    应该是两个full scan
    创建组合索引以后应该是
    index scan而且不需要根据rowid来查找数据了。
      

  7.   

    是不是a表有以col3为前导列的索引,b表没有以col3为前导列的索引
    还是要看一下2个语句的执行计划!!
      

  8.   

    哈哈,刚刚回答了一个类似的问题。只好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掉的可能!呵呵。这个和搂住的问题几乎一样。没想到,这是一个普遍的问题啊!!!
      

  9.   

    a: col3,col1,col2
    b: col3,col1,col2
    建立复合索引,注意把col3放在前面不要把update和select+insert做比较,没什么可比性。
    大数据量的UPDATE或DELETE,超过表的一定比例时,不如就建立临时表再RENAMEUPDATE,是慢:)
      

  10.   

    update  a set (a.col1,a.col2)=(select b.col1,b.col2 from b where b.col3=a.col3)连where条件也没加,更新的话把所有数据都更新了一遍,会造成更新后结果有误的。
      

  11.   

    条件有关系,但是UPDATE就没有INSERT 快
      

  12.   

    所说的方法都已试过,a表中的所有col1,col2 字段都为空而且:
    select count(*) from a=select count(*) from a,b where a.col3=b.col3;
    我试过了对于a是大表b是小表的情况下执行时间比较短,而对于两者都是非常大的表不管建立不建立索引
    好像会话已经死锁了。能谈一下死锁的原因和解决之道吗?
      

  13.   

    只能说你的表一定已经锁住了。
    你这样全表的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)
      

  14.   

    仔细想过这个问题,好像的确有可能是表被锁了,应为我在不同的session 中执行了相关的存储过程