大容量数据分页显示的探索
2009-08-07 08:49
239 查看
最近在帮别人开发一个程序的时候遇到了10w以上数据显示的问题,若是直接用ADOConnection+Adoquery+Datasource+DBGrid来显示确实简单,但是在读取数据的时候明显比较慢,而且问题是每一次打开数据连接,ADO会把所有的数据读入到DataSet中。尽管现在数据是10w多一点,时间上还可以忍受,但是未来数据量达到100w后,那应该是不堪设想的,所有就想到了分页显示的问题。
经过网络搜索有,有几种方法可以解决这个问题:
1、通过ADO自带的MaxRecords来限制,用Page来分页,可以再DBGrid中实现分页,但是发现这个方法也不是很,因为在整个过程中ADO还是把所有数据先读取,然后在DBGrid中实现了显示的分页,不符合我的要求。(想法:这个方面自己没有深入研究,也许是我的知识技能肤浅而没有实现吧)。
2、用过DataSetProvider和Clientdataset来实现分页,用语句:
ADOtable1.RecNo:=NextRecords;//下一页的开头记录位置
ClientDataset.Data :=DataSetProvider1.GetRecords(10, recsout, MetaDataOption);来实现,确实也可以,问题是数据在Datasetprovider中还是全部读取,在Clientdataset中倒是显示需要的内容,所以放弃。(想法同上)
3、有人提出来,大容量数据分页最好在数据存储的时候就进行。个人认为这个想法确实很好,具体怎么进行,我的想法是:若我想以20条记录为一页,那么就用关键字id来进行记录,每20页为同样的关键字;在分页查询时只要以id的增加来进行分页,实现简单,效率不错。
4、目前我的用法,采用Delphi盒子中jasonmale的方法:
一般来说,我们在发送sql语言时,限制取得数据笔数,如取20笔(SQLSERVEER中使用Top关键字,PG中使用limited)。如果取下一页怎么办。这里就需要确定这次查询的数据字符中有确定唯一性值(关键字key),取下一页使用同样的SQL语句,但WHERE条件中需要key>界面上最后一笔的关键记录值, 同时又限制记录数量20个。
如SQLSERVER例子:第一次查出记录 select top 20 key field1,field2 from table
key, field1 field 2
A fv1 fv2
B fv11 fv22
C ...
D...
下一页 : select top 20 key,field1,field2 where key>'D'
...
上一页: select top 20 key ... where key<'A'
最后一页:select top 20 key.... order by key desc
有一个问题,如果关键是二个,并且非字符类型,怎么办。一样,先使用SQL中函数把非字符类型转换成固定格式的字符串(注意,FLOAT和INTEGER的转换需要统一长度的字符),再把多个关键字联合(+)成一个虚拟字段就OK了。
这种方法对于已经存在大容量数据的程序来说也是不错的方法,我就根据这种方法完成了开发,读取时只读取规定的记录数量,而没有全部读取(这一点是关键),内存占用不高,并且效率也不错。这是现在对分页技术的一点点探索与尝试。
经过网络搜索有,有几种方法可以解决这个问题:
1、通过ADO自带的MaxRecords来限制,用Page来分页,可以再DBGrid中实现分页,但是发现这个方法也不是很,因为在整个过程中ADO还是把所有数据先读取,然后在DBGrid中实现了显示的分页,不符合我的要求。(想法:这个方面自己没有深入研究,也许是我的知识技能肤浅而没有实现吧)。
2、用过DataSetProvider和Clientdataset来实现分页,用语句:
ADOtable1.RecNo:=NextRecords;//下一页的开头记录位置
ClientDataset.Data :=DataSetProvider1.GetRecords(10, recsout, MetaDataOption);来实现,确实也可以,问题是数据在Datasetprovider中还是全部读取,在Clientdataset中倒是显示需要的内容,所以放弃。(想法同上)
3、有人提出来,大容量数据分页最好在数据存储的时候就进行。个人认为这个想法确实很好,具体怎么进行,我的想法是:若我想以20条记录为一页,那么就用关键字id来进行记录,每20页为同样的关键字;在分页查询时只要以id的增加来进行分页,实现简单,效率不错。
4、目前我的用法,采用Delphi盒子中jasonmale的方法:
一般来说,我们在发送sql语言时,限制取得数据笔数,如取20笔(SQLSERVEER中使用Top关键字,PG中使用limited)。如果取下一页怎么办。这里就需要确定这次查询的数据字符中有确定唯一性值(关键字key),取下一页使用同样的SQL语句,但WHERE条件中需要key>界面上最后一笔的关键记录值, 同时又限制记录数量20个。
如SQLSERVER例子:第一次查出记录 select top 20 key field1,field2 from table
key, field1 field 2
A fv1 fv2
B fv11 fv22
C ...
D...
下一页 : select top 20 key,field1,field2 where key>'D'
...
上一页: select top 20 key ... where key<'A'
最后一页:select top 20 key.... order by key desc
有一个问题,如果关键是二个,并且非字符类型,怎么办。一样,先使用SQL中函数把非字符类型转换成固定格式的字符串(注意,FLOAT和INTEGER的转换需要统一长度的字符),再把多个关键字联合(+)成一个虚拟字段就OK了。
这种方法对于已经存在大容量数据的程序来说也是不错的方法,我就根据这种方法完成了开发,读取时只读取规定的记录数量,而没有全部读取(这一点是关键),内存占用不高,并且效率也不错。这是现在对分页技术的一点点探索与尝试。
相关文章推荐
- JSP完成数据分页显示
- jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
- SSH框架中 分页显示数据Demo
- 使用DataList分页显示数据,双向排序,添加checkbox控件
- ADODB数据分页查询提高数据显示速度
- servlet与javabean实现长文本数据分页显示
- 实现千万级数据的分页显示!
- 实现小数据量和海量数据的通用分页显示存储过程
- hibernate分页查询,在自己写的s2sh注册登录的基础上添加对数据表的分页显示功能
- 一个用存储过程实现数据分页显示的例子,有更合适的请朋友们跟帖啊
- 纯Sevlet登陆页面与数据分页显示
- ajax 笔记--不用刷新实现数据的分页显示 2 (上)
- asp.net列表数据显示+分页
- 前台jsp获取后台查询的结果集数据并实现分页显示
- jQuery+Ajax+PHP+Mysql实现分页显示数据
- 对数据进行分页,显示到table中。
- 分页显示批量数据
- 使用DataList和SQL2005实现分页显示数据(应用举例:站内简单搜索)
- jQuery+Ajax+PHP+Mysql实现分页显示数据
- 每行显示2条数据的分页