我在定时器里每隔5分钟从这边数据库读取4万多的数据,通过循环到另一个库中相应的表里作更新。结果程序总是无响应,卡死。有没什么好的方法可以解决这样的问题?
解决方案 »
- delphi 数据库中的多条记录如何接着输出 ?
- SQL_DMO问题,如何修改还原后的数据库文件路径
- DataSet导出至Excel的控件
- 求助数据插入问题!
- 关于在delphi中对两个日期之间的记录进行查询。急急!!!!
- 大家帮我出出主意!!!我的系统初始化,谢谢!
- 请问:怎样在程序中将dbgrid的指定行加亮显示(选中)?
- 如何让DELPHI程序更小些???(外加一个小问题)
- 有大神看的出来这段代码哪里有问题吗?为何总是读不出图片?
- 修改注册表的问题
- [讨论] 金山T盘客户pc端能实现不用验证码登录软件,用delphi能实现吗 附件为金山T盘软件,要求提供delphi实现主要代码,WEB调用的话不行
- 遇到不懂的类该怎么查呢?
Application.ProcessMessages;
http://bbs.csdn.net/topics/360046056
2、遍历4万条记录,如果用 ADO ,5分钟可能是不够的,用DBX吧,遍历速度快不少。
3、插入速度。因为插入数据时可能需要扩充表空间,所以有时数据库操作会突然停顿的,这个写程序时应该考虑到,保障上次操作未完成,不进行新的操作,这样不至于产生锁的问题,也减轻服务器压力。插入时,使用事务批量插入,一般速度会快些。
4、如果是SQL服务器忙不过来时,增加线程只是让服务器更忙。没办法完成得更快一些。
var
ssql,vehiid:string;
begin
While ( Not self.Terminated ) Do
begin
Try
if isTerminated then
break;
with DataModule1.mdtstatusqry do
begin
if mdtstatuscount=0 then //没有记录退出
begin
inbdmdtstatus.isTerminated:=true;
inbdmdtstatus.Free;
exit;
end;
while not eof do
begin
inc(inthreadindex);
//插入表代码//
........
//插入表代码// if inthreadindex=1000 then
begin
break;
end;
next;
end; if RecNo=mdtstatuscount then//处理完结束进程退出
begin
inbdmdtstatus.isTerminated:=true;
inbdmdtstatus.Free;
exit;
end; end;
sleep(500);
except
end;
end;{ Place thread code here }
end;
调用数据库对应的isql或osql等命令行工具去执行这个sql文件
LZ的插入记录代码可以优化下,4W条数据,5分钟怎么可能处理不完。我看你代码是循环逐条插入,这是最慢的,按楼上的方法,可以快很多,也可以查下数据库关于插入记录速度优化的帮助。(MySQL逐条插入10W条数据得30分钟以上,用批量插入3分钟不到,用Load file方式,2分钟不到)