论文部分内容阅读
摘要:数据分页是基于数据库的动态Web系统所必需的技术。Microsoft公司的ADO(Active Data objecc)数据存取技术提供了一种基于Recordset的数据分页方法,该方法简单易用,却由于效率原因,不适用大数据量的快速定位分页。文章对该方法从根本上进行了改进,获得了非常明显的效果,完全适用于企业级应用的海量数据分页定位。
关键词:Web分页技术;ADO;Recordset;改进
0引言
随着信息技术的发展,人们越来越多地借助于计算机和网络获取信息,但是面对浩如烟海的信息资源,查询结果往往会有成千上万条数据。数据分页技术提供了一种有效的途径,使我们可以像看书一样,一页一页地浏览查询结果。本文对广泛应用在动态Web系统中的ADO Recordset数据分页技术,进行了必要的改进。
1数据分页方法
所谓数据分页方法,是将查询结果分页显示的方法,是基于数据库的动态Web系统所必需的技术。因为数据库中需要显示的数据可能有成千上万条,大量的数据从数据库服务器经过网络传输到客户端浏览器,必须组织成便于浏览的方式显示给用户。如图l所示Google搜索系统就应用了数据分页技术。
![](https://www.soolun.com/img/pic.php?url=http://img.resource.qikan.cn/qkimages/jsjs/jsjs200703/jsjs20070327-1-l.jpg)
2 ADO Recordset分页方法
ADO(Active Data Object)技术是Microsoft公司支持的一种主要的数据存取技术,是Microsoft提出的各种数据存取技术的演化结果,目前是Windows平台存取数据的标准。
ADO使用了集合对象的概念,其中Recordset对象是ADO的灵魂对象,它封装了完善的数据处理功能。ADO提供了一种数据分页技术,是通过Recordset对象来实现的。Recordset对象有很多属性和方法,其中与分页有关的有以下属性:
AbsolutePage:当Recordset设置有分页时,返回当前页码;
PageCount:当Recordset设置有分页时,返回分页总数;
PageSize:当Recordset设置有分页时,为每页的记录个数;
RecordCount:返回当前Recordset对象内的记录数。
使用Recordset对象来实现分页显示十分简单:先建立一个Recordset对象,将查询到的记录封装进Recordset对象之中;然后引用RecordCount属性值可以获得记录总数,根据需要设置PageSize属性,则可以得到分页总数PageCount,其中PageCount取大于或者等于rRecordCount/PageSize]的最小整数。然后设置AbsolutePage属性后,就可以返回某一分页的记录内容。以下代码实现了A_Table表中的第6页(第5l一60条目录)的数据显示。
(1)Set rs=Server.CreateObiectCADODB.Recordset")
(2)rs.ActiveConnection=Connection_String
(3)rs.Source="Select*From A_Table"
(4)rs.CursorType=0
(5)rs.CursorLocation=2
(6)rs.LockType=l
(7)rs.Open()
(8)Recordset.PageSize=10
(9)Recordset.AbsolutePage=6
(10)ShowData
这种技术被广泛应用在基于Windows平台的动态Web数据库系统中,尤其是基于ASP(Active Server Pages)的中小型Web系统中。
3 ADO Recordset分页方法的弊端
利用ADO的Recordset对象可以简单方便地实现数据分页,可是必须将所有数据全部封装进Recordset对象后才能进行分页,如果数据量很大,比如超过上万条,那么封装数据就是一个相当耗时、耗资源的过程,因此该技术只能适合小数据量的分页显示,对于设计企业级应用系统没有多大实用价值。
![](https://www.soolun.com/img/pic.php?url=http://img.resource.qikan.cn/qkimages/jsjs/jsjs200703/jsjs20070327-2-l.jpg)
4 ADO Recordset分页方法的改进
为了提高ADO Recordset分页方法的效率,就必须从减小Recordset封装的记录个数着手。分析上述代码中第3行的SQL查询语句Select*From A_Table可知,如果直接在SQL语句中限制返回的记录数,则可以限制Recordset的大小。最理想的情况是只返回所需要的记录数,做到精确存取,从根本上改变了Recordset分页封装所有记录的“粗放式”存取。
以下是改良后的代码,仍然生成Recordset,但是摒弃了Recordset的AbsolutePage等相关分页属性,Recordset封装记录时限制记录个数,直接取第51-60条记录作为Recordset的数据集合。其中Rownum代表记录在表中存储所在行的序号,是数据库中的关键字,是被Oracle等数据库支持的伪列。
(1)Set rs=Server.CreateObjectCADODB.Recordset")
(2)rs.ActiveConnection=Connection_String
(3)rs.Souree="Select。From A_Table where Rownum<60and Rownum>50"’
(4)rs.CursorType=0
(5)rs.CursorLocation=2
(6)rs.LockType=l
(7)rs.Open0
(8)ShowData
某些早期Oracle版本(如Oracle5)仅支持Rownum的“<”和“<=”操作,而不支持“>”和“>=”等操作。可以通过l临时视图将伪列转化为可以实际比较的列进行操作:Create V_Temp AsSelect Rownum RN,A_Table.From A_Table,然后将上面代码中的第3行改为:rs.Source=”Select}From V_TempWhere RN<60 and RN>50"。运行完第8行显示完数据再删去临时视图:Drop View V_Temp。虽然改良后的方法引入了临时视图,增加了创建和删除临时视图的开销,但该方法却控制了生成Recordset的数据集合的大小,在大数据量的情况下,就会显示出明显的效率优势。
5两种分页方法效率的对比测试
表1是A_Table中的记录个数分别为100、200、1000、2000、10000、20000、100000和200000的情况下,浏览第51-60条记录时,采用两种分页方法完成分页的时间T、运行所耗资源(包括CPU时间u和内存使用M)的对比情况。测试平台是PIIl500,256M RAM,Windows 2000 Professional,某型Oracle数据库,测试用表每记录有33个字段,约500字节。其中第二种方法的实现引入了临时视图,效果数据中包括建立和删除临时视图的开销。图2是两种分页方法执行时间对比,图3是两种分页方法运行所需CPU时间对比,图4是两种分页方法运行所需内存对比。
6结束语
从表l和图2、3、4可以看出,直接使用Microsoft的ADORecordset分页定位技术,其所需的时间,所花的CPU时间和内存空间的开销,是随着表的规模成线性增长的,当表中记录达到10000规模以后,定位到某页就需要数分钟时间,基本上已经失去了在Web上的使用价值。而改良后的定位分页方法,由于从根本上减少了大量封装记录的过程,因而其开销非常小,其CPU时间和内存不随表的规模而变化,访问时间也很快。在20万条记录的表中,改良后的方法即使包含了创建和删除临时视图的开销,其定位1页的时间也仅为6秒,是改良前方法的0.16%,所耗CPU时间是改良前的0.12%,所耗内存是改良前的11.3%,效率分别是改良前的625倍、830倍和8.84倍。
(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)
关键词:Web分页技术;ADO;Recordset;改进
0引言
随着信息技术的发展,人们越来越多地借助于计算机和网络获取信息,但是面对浩如烟海的信息资源,查询结果往往会有成千上万条数据。数据分页技术提供了一种有效的途径,使我们可以像看书一样,一页一页地浏览查询结果。本文对广泛应用在动态Web系统中的ADO Recordset数据分页技术,进行了必要的改进。
1数据分页方法
所谓数据分页方法,是将查询结果分页显示的方法,是基于数据库的动态Web系统所必需的技术。因为数据库中需要显示的数据可能有成千上万条,大量的数据从数据库服务器经过网络传输到客户端浏览器,必须组织成便于浏览的方式显示给用户。如图l所示Google搜索系统就应用了数据分页技术。
![](https://www.soolun.com/img/pic.php?url=http://img.resource.qikan.cn/qkimages/jsjs/jsjs200703/jsjs20070327-1-l.jpg)
2 ADO Recordset分页方法
ADO(Active Data Object)技术是Microsoft公司支持的一种主要的数据存取技术,是Microsoft提出的各种数据存取技术的演化结果,目前是Windows平台存取数据的标准。
ADO使用了集合对象的概念,其中Recordset对象是ADO的灵魂对象,它封装了完善的数据处理功能。ADO提供了一种数据分页技术,是通过Recordset对象来实现的。Recordset对象有很多属性和方法,其中与分页有关的有以下属性:
AbsolutePage:当Recordset设置有分页时,返回当前页码;
PageCount:当Recordset设置有分页时,返回分页总数;
PageSize:当Recordset设置有分页时,为每页的记录个数;
RecordCount:返回当前Recordset对象内的记录数。
使用Recordset对象来实现分页显示十分简单:先建立一个Recordset对象,将查询到的记录封装进Recordset对象之中;然后引用RecordCount属性值可以获得记录总数,根据需要设置PageSize属性,则可以得到分页总数PageCount,其中PageCount取大于或者等于rRecordCount/PageSize]的最小整数。然后设置AbsolutePage属性后,就可以返回某一分页的记录内容。以下代码实现了A_Table表中的第6页(第5l一60条目录)的数据显示。
(1)Set rs=Server.CreateObiectCADODB.Recordset")
(2)rs.ActiveConnection=Connection_String
(3)rs.Source="Select*From A_Table"
(4)rs.CursorType=0
(5)rs.CursorLocation=2
(6)rs.LockType=l
(7)rs.Open()
(8)Recordset.PageSize=10
(9)Recordset.AbsolutePage=6
(10)ShowData
这种技术被广泛应用在基于Windows平台的动态Web数据库系统中,尤其是基于ASP(Active Server Pages)的中小型Web系统中。
3 ADO Recordset分页方法的弊端
利用ADO的Recordset对象可以简单方便地实现数据分页,可是必须将所有数据全部封装进Recordset对象后才能进行分页,如果数据量很大,比如超过上万条,那么封装数据就是一个相当耗时、耗资源的过程,因此该技术只能适合小数据量的分页显示,对于设计企业级应用系统没有多大实用价值。
![](https://www.soolun.com/img/pic.php?url=http://img.resource.qikan.cn/qkimages/jsjs/jsjs200703/jsjs20070327-2-l.jpg)
4 ADO Recordset分页方法的改进
为了提高ADO Recordset分页方法的效率,就必须从减小Recordset封装的记录个数着手。分析上述代码中第3行的SQL查询语句Select*From A_Table可知,如果直接在SQL语句中限制返回的记录数,则可以限制Recordset的大小。最理想的情况是只返回所需要的记录数,做到精确存取,从根本上改变了Recordset分页封装所有记录的“粗放式”存取。
以下是改良后的代码,仍然生成Recordset,但是摒弃了Recordset的AbsolutePage等相关分页属性,Recordset封装记录时限制记录个数,直接取第51-60条记录作为Recordset的数据集合。其中Rownum代表记录在表中存储所在行的序号,是数据库中的关键字,是被Oracle等数据库支持的伪列。
(1)Set rs=Server.CreateObjectCADODB.Recordset")
(2)rs.ActiveConnection=Connection_String
(3)rs.Souree="Select。From A_Table where Rownum<60and Rownum>50"’
(4)rs.CursorType=0
(5)rs.CursorLocation=2
(6)rs.LockType=l
(7)rs.Open0
(8)ShowData
某些早期Oracle版本(如Oracle5)仅支持Rownum的“<”和“<=”操作,而不支持“>”和“>=”等操作。可以通过l临时视图将伪列转化为可以实际比较的列进行操作:Create V_Temp AsSelect Rownum RN,A_Table.From A_Table,然后将上面代码中的第3行改为:rs.Source=”Select}From V_TempWhere RN<60 and RN>50"。运行完第8行显示完数据再删去临时视图:Drop View V_Temp。虽然改良后的方法引入了临时视图,增加了创建和删除临时视图的开销,但该方法却控制了生成Recordset的数据集合的大小,在大数据量的情况下,就会显示出明显的效率优势。
5两种分页方法效率的对比测试
表1是A_Table中的记录个数分别为100、200、1000、2000、10000、20000、100000和200000的情况下,浏览第51-60条记录时,采用两种分页方法完成分页的时间T、运行所耗资源(包括CPU时间u和内存使用M)的对比情况。测试平台是PIIl500,256M RAM,Windows 2000 Professional,某型Oracle数据库,测试用表每记录有33个字段,约500字节。其中第二种方法的实现引入了临时视图,效果数据中包括建立和删除临时视图的开销。图2是两种分页方法执行时间对比,图3是两种分页方法运行所需CPU时间对比,图4是两种分页方法运行所需内存对比。
6结束语
从表l和图2、3、4可以看出,直接使用Microsoft的ADORecordset分页定位技术,其所需的时间,所花的CPU时间和内存空间的开销,是随着表的规模成线性增长的,当表中记录达到10000规模以后,定位到某页就需要数分钟时间,基本上已经失去了在Web上的使用价值。而改良后的定位分页方法,由于从根本上减少了大量封装记录的过程,因而其开销非常小,其CPU时间和内存不随表的规模而变化,访问时间也很快。在20万条记录的表中,改良后的方法即使包含了创建和删除临时视图的开销,其定位1页的时间也仅为6秒,是改良前方法的0.16%,所耗CPU时间是改良前的0.12%,所耗内存是改良前的11.3%,效率分别是改良前的625倍、830倍和8.84倍。
(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)