我有个任务 获得用户的首次发生短信的记录。用户数量有200万,短信发生记录有8千万条。
开始采用的方法是 取用户发送最小时间的记录
select username min(sendtime) mintime
from sms_send
group by usrename
获得最小时间后 再去获得该记录的所有信息出来。采用inner join sms_send on sendtime=mintime and username=username
1 相对很慢,2 老是出问题 数据量少了,或者是最小时间不对
用户名上有个索引
第二种方法是,采用游标
for cur_name in (select username from userinfo)
loop
insert into t_new_send_userinfo
select *
from
(
select *
from sms_send
where username=cur_name.username
order by sendtime asc
)
where rownum<=1
end loop;
面对大量数据 跑了17个时候 看不下去了 端了它! 使用并行提示也不行。
第 三方法 分析函数
insert into t_new_send_userinfo
select *
from
(
select *, ROW_NUMBER() OVER (PARTITION BY username ORDER BY sendtime asc) rowrid
from sms_send
where username=cur_name.username
order by sendtime asc
)
where rowrid=1
加了并行提示后用了24分钟 插入了59万条数据