1 编写目的
解决系统需要检索大数据列表时的性能问题,而提出的分页方案
2 术语、定义和缩略语
3 大数据量检索的性能问题分析
大数据量检索的性能存在问题,问题主要包括
3.1 客户端在IE或者cs端数据量过大会导致IE变慢,甚至死锁
现象:
IE浏览器崩溃
浏览器白板,停止响应
3.2 客户端--web服务器之间的数据传输量大会导致客户端速度变慢,效率降低
现象:
IE浏览器长期在等待时白板
IE 浏览器操作慢
3.3 中间层构造大数据列表会导致中间层性能降低
现象:
并发访问多时,应用服务器和数据库服务器cpu占有量过大
导致系统性能降低
3.4 数据库sql一次选取大数据量会导致数据库性能降低
3.4.1 如果一次查询返回数据过多会影响性能
3.4.2 如果检索条件繁琐也会影响性能
现象:
并发访问多时,数据库服务器负载大cpu占有量过大
数据库服务器和应用服务器通信会造成瓶颈
4 方案论证
4.1 传统解决方案候选方案- web服务端分页
在web服务端实现分页,根据用户选择的页数,选取指定的数据返回到客户端
优点:开发简单
优点:解决了web端和客户端数据传递的问题
缺点:不能解决中间层和数据库的性能
4.2 优化解决方案(1)-数据库分页
根据用户当前选择的页数,每次从数据库选取这些数据,比如每页100条,选第二页的时候就只查询第200条到300条的数据。
1) 设计分析。
优点:可以解决除3.4.2外的所有性能问题
缺点:每次查询要用rownum构造子查询选取指定数据
缺点:Oracle 和 Sqlserver2005都支持,但之前的sqlserver版本只支持Top
缺点:大数据量如果检索条件性能低的话,不能解决1.4.2的性能问题
缺点:开发稍微复杂,但是可以通过封装解决
4.3 优化解决方案(2)-所见即所取的虚模式数据库分页()
第一次查询返回第一页的列表数据,然后异步的获取一定数量级的serial_id到客户端,客户选择页数的时候把此页的serial_id传递到服务器构造 id=001 or id = 002 or id = 003 的查询,返回列表数据。。
1设计问题。
优点:可以解决所有的大数据量的性能问题。
这样做主要是解决检索条件繁琐的性能问题,主要场景就是检索性能低的时候,只有第一页速度慢,然后每页速度都很快(因为是通过主键检索)
优点:不使用数据库特性,任何数据库都支持
缺点:开发复杂,但是可以通过封装解决
4.4 其他提高性能的方法
a) 大部分用户都是只看第一页数据,首次选取只选取前pagesize条数据。点每个页码的时候再试用分页方案
b) 系统bs端没有优秀的列表控件,还没能实现显示列的自定制,实现了显示列的自定制,可以在db端只选取指定列的数据。
c) 也可以不用分页的模式,用虚模式的滚动条列表来浏览数据,实际的展示效果比分页模式好
参考: (1)