var
S:String;
begin
ADOQuery1.SQL.Text:='select top 200000 field1 from mytable';
ADOQuery1.Open;
While not ADOQuery1.Eof do
begin
S:=trim(ADOQuery1.FieldValue['field1']);
...
...
ADOQuery1.Next;
end;
ADOQuery1.Active:=false;
end;我在执行上述过程的时候(Delphi+SQL server2000)发现执行速度很慢,
经过分析主要的时间都开销在ADOQuery1.Next上,
各位有没有好的方法可以快速的从数据库中查询和在本地取出数据啊!
S:String;
begin
ADOQuery1.SQL.Text:='select top 200000 field1 from mytable';
ADOQuery1.Open;
While not ADOQuery1.Eof do
begin
S:=trim(ADOQuery1.FieldValue['field1']);
...
...
ADOQuery1.Next;
end;
ADOQuery1.Active:=false;
end;我在执行上述过程的时候(Delphi+SQL server2000)发现执行速度很慢,
经过分析主要的时间都开销在ADOQuery1.Next上,
各位有没有好的方法可以快速的从数据库中查询和在本地取出数据啊!
解决方案 »
- 急简单form问题,在线等×××××××××××
- 怎么动态建立一个SQL数据表,并写入数据
- 关于combobox的问题
- DainelLee! 请问 'where... and departmentid in (select ... and parent_id like ''%'+parent_id_str+'%'')',请问错在哪里了
- 一个SQL的问题?
- 一直在用D7,想升级开发工具XE2、XE3、XE4哪个更理想
- 高分求解!!!保存出错!!
- Access的标题问题
- 请问那里有中文的API函数下载
- 问过很多人都不能解决的问题。
- 急、急、急:怎样使TreeView上邦定值时速度更快些?
- 向深圳的朋友问个技术无关的问题, 关于java与dotnet工资方面的!
返回数据集尽量小;
ADOQuery1.FieldValue['field1']采用adoquery1.Fields[0].Value代替或者建一个字段
使用服务器游标或客户端游标(你测试一下)
我必须把比如200000条数据全部查询出来(实际上我要查询出所有的记录,因为数据记录有
几十万,所以这是模拟取出200000条记录进行测试),当把所有记录的值取出来后,我才能进行下一步的操作
最后自己... ...把65535条字符串(每条长度在260以上)在程序初始化的时候通通装到一个全局TStrings...
读出来后可以考虑用线程在后台处理啊。
我马上也要搞个大数据量的统计报表了....
现在都没啥头绪..苦恼得很.....
1我不知道你‘...’干了些什么,如果你确定只是.next那句话才慢的话,那就不要紧,看下一步
2我不知道你的数据库中这个表的字段类型,以及insert/update和select的动作比例有多频繁,其实我说的是索引,
3我不知道你究竟要干什么,非要把记录全部取出(能不慢吗???),如果非得这样的话,考虑用存储过程完成主要数据库操作。
4如果你还没解决,请发消息
CusorLoacation := clUseServer; //服务器游标
CacheSize := 100; //本地缓冲大小
我用100000条在sql server上做了测试,使用默认的客户端游标,缓冲为1,执行时间为160多秒,
使用服务器端游标,执行时间为0.35秒;
使用服务器端游标,本地缓冲设为100,执行时间为0.23秒。
我要的不是这个
你测试一下这个:
while not ADOQuery1.eof do
begin
ADOQuery.next;
end;
光是这个过程都要花消很多时间啊
这个TRIM()步骤不可以在SQL语句"SELECT"里就执行吗?
有其它快速方式读取缓冲区数据吗?