10万条数据的数据库问题(100分)

  • 主题发起人 主题发起人 andysw
  • 开始时间 开始时间
A

andysw

Unregistered / Unconfirmed
GUEST, unregistred user!
我是用的access数据库,其中有10万条数据,我要对其中每条数据的身份证进行验证,用
adoq1.SQL.Add('select * from info');
adoq1.Open;
while adoq1.Eof = false do
begin
验证代码
andoq1.Next;
end;
我这样是不是把10万个身份证都放到了adoq1了,然后程序一运行,程序就死了,不知道
有没有朋友能帮帮我,在这里先谢谢了。。。。。。。
 
加条件,减少数据量: select * form info where ...
 
分类,比如以1开头的等等或者按照出生年份
 
可能是你的验证代码有问题也未可知
 
1、建立索引
2、不要select *,只查询有用的字段。
3、尽量返回较少量的数据。如加where
4、有进度条吗?每循环一次后面加一个application.ProcessMessages;
如果什么都没有,执行10万次,需要很长时间,可能看起来是死掉了。
 
要考虑一下内存
 
你这个类似死循环了
建议放到线程去处理 否则主窗体会假死
application.ProcessMessages;
虽然可以正常显示主窗体 但是会导致消息堵塞.
用多线程 线程里要加上Sleep.
 
你要做也行,不过你要动态创建ADOQuery,因为ADOQuery控件里包含太多东西,处理很慢。adoq1:= TADOQuery.Create(nil);
adoq1.Connection := ADOConnection1;
adoq1.SQL.Text:='select * from info';
adoq1.Open;
while adoq1.Eof = false do
begin
application.ProcessMessages;
验证代码
andoq1.Next;
end;
最好是通过存储过来来处理
 
superego,谢谢,我是像你这样用TADOQuery.Create(nil);
adoq1.Connection := ADOConnection1;
我的身份证验证我想没什么问题,是网上的一段程序,不是我写的,:)
请问qiuyan0519,你说的“用多线程 线程里要加上Sleep.”,能不能大概写一段代码给我,谢谢,我还从来没接触过多线程。
 
程序没死,只是你的数据太占内存了,造成假死现象。
楼上的方法我同意。但更简洁的是循环Select语名,每次抽取1万条数据
 
我用1G的内存,浪潮的服务器,感觉和在自己的机器上512的内存都一个样,我想和内存关系不大,先前有人说用多线程,不知道多线程能否解决问题,不管怎样,如果哪位能指点一些,让我试试看也行啊
 
一千取一次。完成后取下一千
adoq1.SQL.Add('select top 1000 * from info');
 
网中戏,取了1000,下一个1000,怎么取呢?
 
善用Sql server 的top关键字,数据优化中该关键字用得很多,对查询执行效率影响非常大,我以前就修改过一个存储过程
 
同意楼上。。
至于取下一个1000 条,可以有很多中方法。。

1.分页方案一:(利用Not In和SELECT TOP分页)
2.分页方案二:(利用ID大于多少和SELECT TOP分页)
3.分页方案三:(利用SQL的游标存储过程分页)

就说一下 的一种方案吧。。
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID

这个语句列出了21-31 的数据;

效率比游标高。。我刚试过,你自己也试一试吧。。
 
实际上有很多分数据的方法啊,比如加个自动编号,然后按照编号段查询啊
 
最快的方法就是单线程

多CPU除外
 
分组,比如1000条记录为一组,并在记录上分配组号,然后用Where来定制验证记录的分组查询号。
 
用分组比较好一点
 
后退
顶部