分页技术原理与实现(一)——为什么要进行分页及怎么分页
什么是分页技术
分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自习自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己想要的内容为止.其实这和我们阅读书籍很类似.
下页显示了两种常见的分页方式:

分页的意义
分页确实有效,但它一定会加大系统的复杂度,但可否不分页呢?如果数据量少的话当然可以.但是对于企业信息系统来说数据量不会限制在一个小范围内.如果不顾一切的Select * from某个表,再将返回的数据一古脑的扔给客户,即使客户能够忍受成千上万足够让人眼花缭乱的表格式数据,繁忙的网络,紧张的服务器也会提出它们无声的抗议,甚至有时会以彻底的作为终结.这个结局有点像古代为所欲为的暴君和他忍无可忍的臣民之间的故事.
程序员不是暴君,他希望程序使生活变得更好而不是更糟.考虑到企业信息系统多是三层甚至更多层架构的事实,程序员在向客户展示数据时都应该采取分页的形式.如果他不想被抱怨淹没或是半夜被电话惊醒的话.
从请求发起到返回数据的整个过程
现在你已经下定决心想要分页了,在动手书写代码之前,先让我们回想一下,在典型的三层架构中,从请求发起到返回数据的整个过程.如下所示:

在哪里进行分页
从上面的图中我们可以观察得知,在SQL语句处理完毕后,数据库,WebApplication和Browser都能进行分页,那在哪里分页好呢?
判断的标准是速度,显而易见,数据库服务器,Web应用服务器和客户端之间是网络,如果网络传递的数据量越少,则客户端获得响应的速度越快.而且一般来说,数据库服务器和Web应用服务器的处理能力一般比客户端要强很多.从这两点来看,在客户端分页的方案是最不可取的.
其次就剩下了在Web服务器端分页和在数据库端分页两种方式了,如果选择在Web服务器端分页的话,大部分的被过滤掉的数据还是被传输到了Web应用服务器端,与其这样还不如直接在数据库端进行分页.
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。
分页的SQL语句
如果我们是通过JDBC的方式访问数据库,那么就有必要根据数据库类型采取不同的SQL分页语句,对于MySql数据库,我们可以采用limit语句进行分页,对于Oracle数据库,我们可以采用rownum的方式进行分页.
(1)MySql的Limit m,n语句
Limit后的两个参数中,参数m是起始下标,它从0开始;参数n是返回的记录数。我们需要分页的话指定这两个值即可
(2)Oracle数据库的rownum
在Oracle数据库中,分页方式没有MySql这样简单,它需要依靠rownum来实现.
Rownum表示一条记录的行号,值得注意的是它在获取每一行后才赋予.因此,想指定rownum的区间来取得分页数据在一层查询语句中是无法做到的,要分页还要进行一次查询.
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。
上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。
选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
)
WHERE RN BETWEEN 21 AND 40
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
附:分页技术实现:http://www.blogjava.net/sitinspring/archive/2008/09/13/228771.html
附:Oracle分页查询:http://yangtingkun.itpub.net/post/468/109834
附:使用 PHP 和 Oracle 实施分页结果集:http://www.oracle.com/technology/global/cn/pub/articles/oracle_php_cookbook/fuecks_paged.html
其实分页技术还有很多其它技术,比如:Struts、Hibernate等等都可实现。
分页技术原理与实现(二)——Java+Oracle代码实现
分页技术原理与实现(三)——无刷新的Ajax分页技术
分享到:
相关推荐
"分页源代码——安博教育的"这个标题表明这是一份与分页功能实现相关的源代码,可能来源于安博教育集团,一个知名的教育机构,专注于提供各种IT教育资源。 分页技术的核心是将大数据集分割成多个较小的部分,每个...
"安卓Andriod源码——gridview分页效果.zip"这个压缩包可能包含了一个示例项目,演示了如何在GridView中实现分页效果。以下是对这个主题的详细讲解: 1. GridView基本概念: GridView继承自AbsListView,它会将...
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求分页存储管理系统的原理和实现技术的理解。下面是实验的详细说明和相关知识点: 实验目的 了解请求分页存储管理系统的原理和实现技术,通过模拟实验...
在IT行业中,分页是一种常见的数据展示方式,尤其在网页应用和大数据量处理时更为重要。本项目"分页项目的实现.zip"显然关注的是如何在实际应用中实施分页功能。下面将详细讲解分页的基本原理、实现方法以及在HTML...
为了解决这个问题,分页技术应运而生。jPage 是一个流行的 JavaScript 分页插件,它支持异步分页,能够在用户滚动页面时动态加载数据,从而提高网页性能和用户体验。 ### 1. jPage 分页原理 jPage 的核心思想是...
无论是传统的ASP开发还是现代的前端框架,分页的实现都是基于相同的基本原理——限制数据查询数量并提供导航功能。掌握分页技术对于任何Web开发者来说都是一项必备技能,能够帮助他们在处理复杂数据集时更加得心应手...
2. 分页技术原理: 分页是处理大量数据时常用的一种优化策略,它可以将数据分批加载,减少一次性加载所有数据对服务器的压力,同时提高用户体验。实现分页通常需要两个关键参数:当前页码和每页显示的条目数量。在...
在Web开发中,为了提升用户体验、减少服务器负担并提高页面加载速度,真分页技术成为了一种重要的实现手段。本篇文章将详细解读如何利用JSP中的JSTL标签库实现真分页功能。 #### JSTL简介 JavaServer Pages ...
首先,我们需要了解MySQL数据库中实现分页的核心SQL语句——LIMIT子句。在SQL语句中,LIMIT用于限制查询结果的数量,它接受一个或两个数字参数,表示从哪一条记录开始查询,以及要查询的记录数。具体使用方式如下: ...
在Web开发中,数据展示往往涉及到大量的记录,因此分页功能显得尤为重要,它可以提升用户体验,避免一次性加载过多数据导致页面响应速度下降。在ASP.NET MVC框架中,我们可以利用各种插件来实现分页效果。本篇文章将...
在Windows Forms(WinForm)开发中,分页控件是一个常用的功能组件,它允许用户以分页的形式浏览大量数据,避免一次性加载所有内容导致界面响应慢或者内存消耗过大。本篇将详细介绍WinForm分页控件及其应用。 一、...
"安卓Android源码——Listview分页加载数据.zip"这个压缩包可能包含了一个示例项目,演示了如何在ListView中实现分页加载功能。下面我们将深入探讨这个主题。 1. **ListView基础**:ListView是Android SDK中的一个...
本知识点将深入探讨“js html动态分页”的原理和实现方法,结合提供的资源——"html自动分页.html",我们将分析如何利用JavaScript和HTML来创建一个高效的动态分页系统。 首先,我们需要理解动态分页的基本概念。...
这个压缩包"安卓Android源码——Listview分页加载数据.rar"很显然是关于如何在ListView中实现分页加载数据的示例代码。分页加载是提高用户体验、优化性能的重要技术,尤其是在处理大量数据时。下面将详细讲解这一...
【JavaWeb分页技术详解】 在JavaWeb开发中,分页功能是不可或缺的一部分,尤其是在处理大量数据时,它能够提高用户体验并减轻服务器负担。在这个JavaEE第二次上机作业——软院找人的项目中,我们将深入探讨如何实现...
标题中的“ssh”通常指的是Java开发中的三个框架——Spring、Struts和Hibernate的组合,而“jQuery分页”则是指在前端使用jQuery库实现数据分页功能。在Web开发中,SSH框架常用于构建后端逻辑,而jQuery则用于增强...
**Ajax无刷新分页技术详解** Ajax(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器交换数据并局部更新页面,实现了用户界面的即时响应,...
根据提供的信息,我们可以深入探讨关于SQL Server中的分页技术及其应用。在处理大量数据时,分页是一项非常重要的功能,特别是在Web应用程序中,它能够帮助我们有效地管理展示的数据量,提高用户体验。 ### SQL ...
操作系统中的分页技术是内存管理的一种重要机制,它将连续的物理内存空间划分为固定大小的块,称为页面,同时将进程的逻辑地址空间也划分为相同大小的块,称为页框。虚拟分页则是在此基础上引入了页表和缺页机制,以...