请教高手:Oracle数据卡大记录数表处理问题

liulianxi 2011-06-18 11:52:27
Oracle数据库中有一个日志表Log,记录数非常大,超过5000万条.
Log表包含如下字段:ClientID, Version, Time

现需要对这个表进行处理,生成一个新的表ClientInfo,按照ClientID提取里面的数据,每个ClientID只需要一条记录:
ClientInfo包含如下字段:ClientID, Version, CreateTime, LastTime
其中,createTime为Client首次访问的时间,也就是Log表中第一记录的时间。
LastTime为Client最近访问的时间,也就是Log表中最好一条记录的时间。

因数据量特别大,怎么写SQL语句,都是执行几天也没有结果。
不知有什么高效的方法,能在几天内执行完。

如果太复杂,也可以去掉ClientInfo中的CreateTime或LastTime。
...全文
80 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulianxi 2011-06-21
  • 打赏
  • 举报
回复
1,insert into ClientInfo(id, ClientID)
select rownum id,clientid from (select dinstinct clientid from log);

2,update ClientInfo t set (t.CreateTime,t.lasttime)
=(select min(time),max(time) from log where clientid=t.clientid)
where id between 1 and 2000;

通过前两步,已经把ClientID,CreateTime,LastTime更新到ClientInfo表了,但其他字段,比如Version却没有更新到ClientInfo表,也无法在第二步中增加字段。
tangren 2011-06-18
  • 打赏
  • 举报
回复
1、先创建表ClientInfo包含字段id, ClientID, Version, CreateTime, LastTime(增加一个id字段用于分段处理)
insert into ClientInfo(id, ClientID)
select rownum id,clientid from (select dinstinct clientid from log);

2、然后根据上表的id来分段处理,注意log表的clientid与time时间上应该建立索引(建立一个组合索引最好)
update ClientInfo t set (t.CreateTime,t.lasttime)
=(select min(time),max(time) from log where clientid=t.clientid)
where id between 1 and 2000;
然后类似方式分段处理2001...5000,你可以根据clientid数量写一个pl/sql块来处理,注意每次列更新完成要提交。
jimmylin040 2011-06-18
  • 打赏
  • 举报
回复
会不会是索引问题?这种需求很常见吧
Rotel-刘志东 2011-06-18
  • 打赏
  • 举报
回复
对这种问题问题还是分段处理的好。

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧