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上,
各位有没有好的方法可以快速的从数据库中查询和在本地取出数据啊!

解决方案 »

  1.   

    你可以从一下几个方面考虑:
    返回数据集尽量小;
    ADOQuery1.FieldValue['field1']采用adoquery1.Fields[0].Value代替或者建一个字段
    使用服务器游标或客户端游标(你测试一下)
      

  2.   

    现在我测试用的是SQL Server2000数据库,但是实际用的是Access数据库
    我必须把比如200000条数据全部查询出来(实际上我要查询出所有的记录,因为数据记录有
    几十万,所以这是模拟取出200000条记录进行测试),当把所有记录的值取出来后,我才能进行下一步的操作
      

  3.   

    几十万的记录装在Access里,我看是疯了。
      

  4.   

    关注,以前问过类似问题,没有有效的解决方案
    最后自己... ...把65535条字符串(每条长度在260以上)在程序初始化的时候通通装到一个全局TStrings...
      

  5.   

    用TClientDataSet试试,这玩意有个PacketRecords属性。
    读出来后可以考虑用线程在后台处理啊。
      

  6.   

    努力学习ING
    我马上也要搞个大数据量的统计报表了....
    现在都没啥头绪..苦恼得很.....
      

  7.   

    我就喜欢解决这些问题
    1我不知道你‘...’干了些什么,如果你确定只是.next那句话才慢的话,那就不要紧,看下一步
    2我不知道你的数据库中这个表的字段类型,以及insert/update和select的动作比例有多频繁,其实我说的是索引,
    3我不知道你究竟要干什么,非要把记录全部取出(能不慢吗???),如果非得这样的话,考虑用存储过程完成主要数据库操作。
    4如果你还没解决,请发消息
      

  8.   

    设定TADOQuery的两个属性
      CusorLoacation := clUseServer; //服务器游标
      CacheSize := 100; //本地缓冲大小
    我用100000条在sql server上做了测试,使用默认的客户端游标,缓冲为1,执行时间为160多秒,
    使用服务器端游标,执行时间为0.35秒;
    使用服务器端游标,本地缓冲设为100,执行时间为0.23秒。
      

  9.   

    to: ppayun(~云彩) 
    我要的不是这个
    你测试一下这个:
    while not ADOQuery1.eof do
    begin
      ADOQuery.next;
    end;
    光是这个过程都要花消很多时间啊
      

  10.   

    S:=trim(ADOQuery1.FieldValue['field1'])
    这个TRIM()步骤不可以在SQL语句"SELECT"里就执行吗?
      

  11.   

    由于读取缓冲区数据next方法很慢,
    有其它快速方式读取缓冲区数据吗?