如题: 有一个文件 20万条记录;
XXX批次的数据
ID,UserId,UserMoney
1,100001,12.34
2,100001,15.34
3,100001,13.34
5,100001,17.34
6,100001,12.34
7,100001,15.34
8,100001,13.34
9,100001,17.34
10,100001,17.34。文件读入Stringlist,这个过程时间很短;一个文件读入入库Project一条记录;然后
接下来,我要把这个内容拆分成 5条内容合成一个记录,然后再入另外一个库User;更新 Project库的拆分进度
也就是 20万 除以 5 = 4万条记录入库
这个过程拆分入库
100001,1,5
100001,6,10 我的方法好像非常笨:
for 1 to 200000 do
begin
ID := StringList[0];
UserID := StringList[0];
UserMoney := UserMoney + StrToInt(StringList[0]);
//入库
事务开始
SQL.add('Insert Into User(StartID,EndID,SumMoney,UserID) Values()。');
SQL.add('Update Porject ') //更新记录,标示拆分到第几行了
事务提交
end;//过程是这样的,代码不是完整,我仅仅说了简单的入库过程,我测试了,大概每秒钟入库也就几十条;很慢
4万条记录,入库需要好长时间;不知道还有没有优化的地方
XXX批次的数据
ID,UserId,UserMoney
1,100001,12.34
2,100001,15.34
3,100001,13.34
5,100001,17.34
6,100001,12.34
7,100001,15.34
8,100001,13.34
9,100001,17.34
10,100001,17.34。文件读入Stringlist,这个过程时间很短;一个文件读入入库Project一条记录;然后
接下来,我要把这个内容拆分成 5条内容合成一个记录,然后再入另外一个库User;更新 Project库的拆分进度
也就是 20万 除以 5 = 4万条记录入库
这个过程拆分入库
100001,1,5
100001,6,10 我的方法好像非常笨:
for 1 to 200000 do
begin
ID := StringList[0];
UserID := StringList[0];
UserMoney := UserMoney + StrToInt(StringList[0]);
//入库
事务开始
SQL.add('Insert Into User(StartID,EndID,SumMoney,UserID) Values()。');
SQL.add('Update Porject ') //更新记录,标示拆分到第几行了
事务提交
end;//过程是这样的,代码不是完整,我仅仅说了简单的入库过程,我测试了,大概每秒钟入库也就几十条;很慢
4万条记录,入库需要好长时间;不知道还有没有优化的地方
前台只监控结果即可。
Re : 只更新一次貌似不合理,因为在拆分的过程中,如果出现异常系统 将无法知道拆分的具体位置!
ID UserId UserMoney
把数据全部导入之后再处理select min(id) as StartID,
max(id) as EndID,
sum(UserMoney) as SumMoney,
UserID
from tb
group by (id-1)/5
OrchidCatlz这样的入库,有很多相关表的处理,一般都做在存储过程里面。这样也好维护。 前台来跑循环,会有慢的问题的。 建议lz把20W数据提交给一个临时表,然后由后台存储过程处理你这些数据的更新,插入等操作。
前台只监控结果即可。 Re:把20万的数据 导入到临时表如何写?
如果这样,那20万数据 ,入库到临时表是不是也是要耗时的
可先将要插入的记录生成四个长的字符串,每个字符串中包含40000条insert语句
分四次执行.
如果是字符串太长,系统不接受,可考虑缩短.如一条1000条
这样会更快,一次一条是最慢的了.