Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1472
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-25 17:06
文章分类
文章存档

2014年(1)

2013年(1)

我的朋友
最近访客

分类: 其他平台

2014-06-06 16:41:43

应用自定义分页技巧进步数据库机能






  
  Web利用程序是显示数据库中数据的一个十分好的方式,通过它,你可以把业务庞杂,并有拜访和保险规矩的数据库数据以一种简单、直观的方法向用户提供查询跟更新的功效。用户断定数据库运用程序一个很常用的尺度就是 处置数据的快慢。很多Web页面都向用户供给了多种可搜寻的列表显示来有效地定位记载的地位,一个比拟简略而且常用的例子就是在线图书查问体系,它容许用户能够按作者,按书名或者按主题来检索图书信息。
  
  ASP.NET提供了一个DataGrid控件可以比以前的ASP方便地创立创建数据列表,DataGrid控件除了内建的数据表示和方法之外,还许可用户本人定义表现情势。分页泛亚娱乐技术:yuan01.bc88.info/fei为用户可治理的数据查找提供便利。DataGrid内建的分页技术很轻易实现,但数据量很大时,它的方便性是以就义性能为代价的。下面,咱们就看看如何通过自定义的分页方法来实现快捷处理大批数据的成果集的措施。我们这里探讨的方法比DataGrid的默认分页办法是疾速和更加有效的,这是由于每次恳求不需要把全体的数据结果发送到Web服务器。相反,它只需要发送每个页面须要的那些数据集。例如:假如一个用户只请求100个页面中每页显示25条记载的第4页的结果集,服务器只要要发送第75-100行的数据即可,而不是1-1000行的完整数据。默认的传递方式如图所示:
  
   
  
  从图中可以看出,DataGrid的内建分页方法是效力不高的,每次要求都必须把全部查询结果发送给Web服务器,Web服务器再把数据分成相应的页面。利用DataGrid的内建的分页方法只管是很简单的,但是,因为Web应用的无序性特点,一个用户每次从一个页面转向另外一个页面时,DataGrid对象都被烧毁并从新创建,这就象征着数据库服务器每次都必须发送全部的结果集。
  
  自定义的分页方法只返回所要检索的那些结果集,如下图所示:
  
  
  
  从上面的图中可以看到,数据库每次只需要返回所要显示的数据记录。首先,我们在数据库中建破一个存储过程,并有两个输入参数,分辨是要返回数据的第一条记录数和最后一条记录数,在SQL Server7.0以上的版本中,都有一个top症结字制约返回到结果集中的前多少条记录数,然而可怜的是,没有一个方法可以返回中间一局部的数据,例如第75条记录到100条记录的数据。Oracle中有一个rownum()的扩大函数可以返回旁边的记录,比方:"select . form Authors where Author_Last_Name \'Anderson\' and rownum() >75 and rownum() <= 100"。然而,由于Oracle是在排序之前指定rownum的值,因此,这样的查询"select * from Authors where rownum <= 25 order by Author_Last_Name"将得不到我们期望的结果。我们下面所讲的方法是针对SQL Server的,但这里的概念对适合Oracle开发人员也是适用的。
  
  要创建一个返回指定条记录结果的存储过程,首先必需指定返回结果集的条记录数,可以用临时表,也可以用table变量SQL Server 2000,两个在性能上不太大的差异,然而,table变量是存储在内存中的,如果你的服务器内存未几的话,可以斟酌用常设表,临时表应用硬盘存储结果,暂时表需要手工开释对象,而table变量在存储过程停止后主动释放。下面就是我们要创建的存储进程:
  
  create proc GetAuthors
  
  Author_Last_Name as varchar(100) null,
  
  StartRow as int null,
  
  StopRow as int null
  
  AS
  
  
   树立有标识符列的table变量
  
  declare t_table table
  
  (
  
  .rownum. .int. IDENTITY (1, 1) Primary key NOT NULL ,
  
  .Author_Last_Name. .varchar. (40) ,
  
  .Author_First_Name. .varchar. (20) ,
  
  .phone. .char. (12) ,
  
  .address. .varchar. (40) ,
  
  .city. .varchar. (20) ,
  
  .state. .char. (2) ,
  
  .zip. .char. (5)
  
  )
  
   在返回指定的StopRow行数之后结束处理查询
  
  Set RowCount StopRow
  
  
   插入到table变量中
  
  insert t_table
  
  (
  
  .Author_Last_Name.,.Author_First_Name.,.phone.,.address.,.city.,.state.,.zip.
  
  )
  
  SELECT .Author_Last_Name.,.Author_First_Name.,.phone.,.address.,.city.,.state.,.zip.
  
  FROM authors
  
  WHERE Author_Last_Name like \'\' + Author_Last_Name + \'\'
  
  ORDER BY Author_Last_Name
  
   返回到准确的结果
  
  SELECT . FROM t_table WHERE rownum > StartRow
  
  ORDER BY rownum
  
  GO
  
  参数StartRow和StopRow接受整数值,代表要返回的开端记录和结束记录,如果要在一个25条记录的页面中返回第4页,我们就可以设置StartRow为76,StopRow为100。我们在table变量t_table中定义了一个叫rownum的整数类型的列,并指定为标识符列,这个列在我们这里先容的分页技术中是很主要的,当我们插入数据时,这个列自动增添,它将在插入数据时起排序作用。SET ROWCOUNT语句对优化性能很要害,它告知SQL Server进行限度要插入的数据,如果我们要76100条记录之间的数据,那么就可以不用插入大于100条记录的数据。最后的SQL语句从t_table的table变量抉择rownum大于或者即是StartRow的那些数据集,而后把它们返回到Web服务器,由Web服务器绑定到DataGrid对象。值得留神的是:如果要得到76到100条记录的数据,我们必须往table变量中插入100条记录的数据,这意味着:如果阅读者请求的页数越来越大,页面性能也会有所降落的。例如:要显示第100页的数据从第2451条记录到第2500条记录,我们必须先向table变量或者临时表填充2500条记录,因而,性能依附于你盘算机的硬件和你要返回的记录数,有测试表明,在SQL Server 2000中使用这样的存储过程均匀在200250毫秒内返回第100页,而返回第一页只需要4毫秒。即便返回第500页的数据从第12451到12500条记录也可以在650到750毫秒内实现。应当说这种情形是很少见到的。 但为了减轻数据库和网络传输的压力,设计公道的查询结果页数是很奏效的。

阅读(176) | 评论(0) | 转发(0) |
0

上一篇:VB编程基础教程20.坐标系统概述

下一篇:没有了

给主人留下些什么吧!~~