现在有两张表A表, B表。A表表结构为: (大概3500万记录)
CardNo, Type,  BeginAccessTime,  EndAccessTime 
B表表结构为: (大概25000万记录)
CardNo, Type, Name, Sex, EndTime除了Type为integer型, 其它字段都为字符串型 
现在要求通过A,B表的CardNo, Type字段, 把B表的EndTime数据更新到A表的EndAccessTime字段.目前使用以下SQL:
Update A Set EndAccessTime = (Select EndTime From B Where A.CardNo = B.CardNo Ando A.Type = B.Type)发现数据库执行了10几个小时还没执行完。 效率太低了。  请求高手, 有什么方法或SQL提高其更新速度。。谢谢。

解决方案 »

  1.   

    具体得看业务逻辑
    你的A,B中CardNo, Type这两个字段有没有重复记录的。查看下有没有索引已经创建了,
    按照这么大的数据量,表不可能没有索引
      

  2.   

    一次性更新这么多数据 肯定会慢的 再怎么优化也是杯水车薪
    我们系统升级 删除2000万条数据 卡了两个小时都没跑完楼主可以用动态sql 加一个循环 每次更新10000条 然后提交
    这样跑起来还是可以的,对回滚段要求小一些
      

  3.   

    根据楼上的。先建立索引
    可以考虑对视图进行update,这也是Oracle所特有的
      

  4.   

    楼主,海量数据尽量不要UPDATE,
      

  5.   

    一 对a表和b表的CardNo, Type两列建立索引
    二 用 merge函数来代替update 
      

  6.   

    楼主,海量数据尽量不要UPDATE,建议你用INSERT处理
    CREATE TABLE C AS
      SELECT A.CARDNO, A.TYPE, A.BEGINACCESSTIME, B.ENDTIME
        FROM A, B
       WHERE A.CARDNO = B.CARDNO
         AND A.TYPE = B.TYPE;
    DELETE FROM A
     WHERE EXISTS (SELECT ENDTIME
              FROM B
             WHERE A.CARDNO = B.CARDNO
               AND A.TYPE = B.TYPE);
    INSERT INTO A
      SELECT * FROM C;
    这样的话效率会高很多的。