access一张表中大约有60W笔记录,主键、该建的索引都建了,程序用delphi开发 
用sql语句的分页方法,查询一页(20笔记录)需要14秒时间 
用ado方式分页更慢,而且狂占内存 直接在access中用sql查询要快一些,大约7秒钟 
access真的这么慢吗 以前一直用mysql,几百万笔的记录分页查询也不过几毫秒啊

解决方案 »

  1.   

    传说中ACCESS单表超过10W条记录,就会很慢。分下表看看。
      

  2.   

      with ADOQuery1 do 
      begin       sqltext := 'SELECT * FROM (SELECT TOP '+inttostr(RecordsInCurrentPage)+' * FROM (SELECT TOP '+inttostr(RecordsInPage*CurrentPage)+' * FROM table order by 编号 desc)TableA ORDER BY 编号 ) TableB ORDER BY 编号 desc';     SQL.Text := sqltext; 
        Open; 
    ... 
      

  3.   

    首先给你点信心,ADO访问Access是相当快的,但对TCustomADODataSet要做一些设置,具体如下:  ADOQuery1.CacheSize := 500;//适当大小的CacheSize可以加快数据集遍历速度
      ADOQuery1.CursorLocation := clUseServer;//服务器端游标可以加快数据集打开速度
      ADOQuery1.LockType := ltReadOnly;//只读锁会加快数据读取速度  ADOQuery1.DisableControls;
      try
        //....打开数据集
      finally
        ADOQuery1.EnableControls;
      end;另外还有一点,如果不用Delphi感知控件,如果速度相求很高。没得说一定要用ADOQuery1.RecordSet原生对象来取值,这样大概时间要少一半。
    当然如果全用原生对象操作会更快,当然程序也麻烦很多了
      

  4.   

    不过你这个SQL写得也太复杂了点。好象ADO控件好象可以自己分页(D好象没有封装!),应该比这个快;因为SQL要简单很多!
    LZ可以研究原生对象的如下几个分页方法:
      ADOQuery1.Recordset.PageCount
      ADOQuery1.Recordset.PageSize;
      ADOQuery1.Recordset.AbsolutePage;祝好运!
      

  5.   

    blazingfire  说的很好!只不过你的这个top语句过于有问题!建议在查查。我记得 格式英爱是
    select top [页大小] [字段] from [表] where [条件 and ] ([排序字段] > (select max([排序字段]) from (select top [页大小]*[页数] [排序段] from [表] [where 条件] order by [排序字段]) as t)) order by [排序字段] 
      

  6.   

    谢谢,设了这些参数后速度快了四倍
    原来用ado分页的方法比用sql分页的方法慢50%,
    重设了参数后,用ado的分页方法反而快了50%
    结贴
      

  7.   

    恭喜你,如果速度还不够建议不用Access,直接用文件来代替。