现在有两张表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提高其更新速度。。谢谢。
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提高其更新速度。。谢谢。
你的A,B中CardNo, Type这两个字段有没有重复记录的。查看下有没有索引已经创建了,
按照这么大的数据量,表不可能没有索引
我们系统升级 删除2000万条数据 卡了两个小时都没跑完楼主可以用动态sql 加一个循环 每次更新10000条 然后提交
这样跑起来还是可以的,对回滚段要求小一些
可以考虑对视图进行update,这也是Oracle所特有的
二 用 merge函数来代替update
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;
这样的话效率会高很多的。