access分页这么慢吗

sun_2000 2008-04-25 03:51:28
access一张表中大约有60W笔记录,主键、该建的索引都建了,程序用delphi开发
用sql语句的分页方法,查询一页(20笔记录)需要14秒时间
用ado方式分页更慢,而且狂占内存

直接在access中用sql查询要快一些,大约7秒钟
access真的这么慢吗

以前一直用mysql,几百万笔的记录分页查询也不过几毫秒啊
...全文
160 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
blazingfire 2008-04-29
  • 打赏
  • 举报
回复
恭喜你,如果速度还不够建议不用Access,直接用文件来代替。
sun_2000 2008-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 blazingfire 的回复:]
首先给你点信心,ADO访问Access是相当快的,但对TCustomADODataSet要做一些设置,具体如下:

Delphi(Pascal) code
ADOQuery1.CacheSize := 500;//适当大小的CacheSize可以加快数据集遍历速度
ADOQuery1.CursorLocation := clUseServer;//服务器端游标可以加快数据集打开速度
ADOQuery1.LockType := ltReadOnly;//只读锁会加快数据读取速度

ADOQuery1.DisableControls;
try
//....打开数据集
finall…
[/Quote]
谢谢,设了这些参数后速度快了四倍
原来用ado分页的方法比用sql分页的方法慢50%,
重设了参数后,用ado的分页方法反而快了50%
结贴
dongfy86 2008-04-26
  • 打赏
  • 举报
回复
blazingfire 说的很好!只不过你的这个top语句过于有问题!建议在查查。我记得 格式英爱是
select top [页大小] [字段] from [表] where [条件 and ] ([排序字段] > (select max([排序字段]) from (select top [页大小]*[页数] [排序段] from [表] [where 条件] order by [排序字段]) as t)) order by [排序字段]

blazingfire 2008-04-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sun_2000 的回复:]
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;
...
[/Quote]
不过你这个SQL写得也太复杂了点。好象ADO控件好象可以自己分页(D好象没有封装!),应该比这个快;因为SQL要简单很多!
LZ可以研究原生对象的如下几个分页方法:
ADOQuery1.Recordset.PageCount
ADOQuery1.Recordset.PageSize;
ADOQuery1.Recordset.AbsolutePage;

祝好运!
blazingfire 2008-04-25
  • 打赏
  • 举报
回复
首先给你点信心,ADO访问Access是相当快的,但对TCustomADODataSet要做一些设置,具体如下:

ADOQuery1.CacheSize := 500;//适当大小的CacheSize可以加快数据集遍历速度
ADOQuery1.CursorLocation := clUseServer;//服务器端游标可以加快数据集打开速度
ADOQuery1.LockType := ltReadOnly;//只读锁会加快数据读取速度

ADOQuery1.DisableControls;
try
//....打开数据集
finally
ADOQuery1.EnableControls;
end;

另外还有一点,如果不用Delphi感知控件,如果速度相求很高。没得说一定要用ADOQuery1.RecordSet原生对象来取值,这样大概时间要少一半。
当然如果全用原生对象操作会更快,当然程序也麻烦很多了
sun_2000 2008-04-25
  • 打赏
  • 举报
回复
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;
...
dongfy86 2008-04-25
  • 打赏
  • 举报
回复
源码呢。
ziping 2008-04-25
  • 打赏
  • 举报
回复
传说中ACCESS单表超过10W条记录,就会很慢。分下表看看。

2,498

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧