论坛登陆 注册 教程 笑话 影视 投稿
首页 | 页界资讯 | 网络应用 | 软件应用 | 组网技术 | 网络原理 | 聊天通讯 | 网管知识 | 帮助
笑话 | 操作系统 | 注 册 表 | 编程开发 | 数 据 库 | 媒体动画 | 网页设计 | 图形图象 | 地图
论坛 | 网络安全 | 安全防范 | 服 务 器 | 硬件学堂 | 路由技术 | 搜索研究 | 站长经验 | 投稿
影院 | 教育频道 | 特色专题 | 精文荟萃 | 注 册 码 | 论坛社区 | 网站地图 | 广告服务 | 旧版
设为首页 加入收藏
当前位置:首页>>文章>>编程开发>>net专区>>正文

ASP.NET中实现大结果集分页研讨

www.xker.com 作者:Tony Qu编译 来源:博客园 加入日期:2006-3-13 10:03:27

【问题提问、论坛交流】在Web应用程序中,对一个大数据库结果集进行分页已经是一个家喻户晓的问题了简单的说,你不希望所有的查询数据显示在一个单独的页面中,所以带有分页的显示才是更合适的虽然在传统的asp里这并不是一个简单的任务,但在asp.net中,DataGrid控件把这一过程简化为只有几行代码因此,在 asp.net中,分页很简单,但是默认的DataGrid分页事件会从数据库中把所有的记录全部读出来放到asp.net web应用程序中当你的数据在一百万以上的时候,这将引起严重的性能问题(如果你不相信,你可以在你的应用程序中执行一个查询,然后在任务管理器中查看 aspnet_wp.exe的内存消耗情况)这也就是为什么需要自定义分页行为,这样可以保证仅获得当前页需要的数据记录

  在网上有很多关于这个问题的文章和帖子,还有一些成熟的解决方案我写这篇文章的目的不是向你展示一个可以解决一切问题的存储过程,而是出于优化已有方法,同时为你提供一个可供测试的应用程序,这样你就可以根据自己的需要进行开发

  但是我对目前网上介绍的方法不是很满意第一,使用了传统的ADO,很明显它们是为“古老”的asp而写的剩下的一些方法就是SQL Server存储过程,并且其中的一些由于相应时间过慢而无法使用,正如你在文章最后所看到的性能结果一样,但是还是有一些引起了我的注意

  通用化

  我要对对目前常用的三个方法进行仔细的分析,它们是临时表(TempTable),动态SQL(DynamicSQL)和行计数 (Rowcount)在下文中,我更愿意把第二个方法称为(升序-降序)Asc-Desc方法我不认为动态SQL是一个好名字,因为你也可以把动态 SQL逻辑应用于另一个方法中所有这些存储过程的通病在于,你不得不估计哪些列是你即将要排序的,而不仅仅是估计主键列(PK Columns)而已,这可能导致一系列的问题——对于每个查询来说,你需要通过分页显示,也就是说对于每不同的排序列你必须有许多不同的分页查询,这意味着你要么给每个排序列做不同的存储过程(无论使用哪种分页方法),也么你必须借助动态SQL的帮助把这个功能放在一个存储过程中这两个方法对于性能有微小的影响,但是它增加了可维护性,特别是当你需要使用这个方法显示不同的查询因此,在本文中我会尝试使用动态SQL对所有的存储过程进行归纳,但是由于一些原因,我们只能对实现部分的通用性,因此你还是得为复杂查询写独立的存储过程

  允许包括主键列在内的所有排序字段的第二个问题在于,如果那些列没有作适当的索引,那么这些方法一个也帮不上忙在所有这些方法中,对于一个分页源必须先做排序,对于大数据表来说,使用非索引列排序的成本是可以忽略不计的在这种情况下,由于相应时间过长,所有的存储过程都是无法在实际情况下使用的(相应的时间各有不同,从几秒钟到几分钟不等,这要根据表的大小和所要获得的第一个记录而定)其他列的索引会带来额外的不希望出现的性能问题,例如如果你每天的导入数据很多,它有可能变得很慢

  临时表

  首先,我准备先来说一下临时表方法,这是一个广泛被建议使用的解决方案,我在项目中遇到过好几次了下面让我们来看看这个方法的实质:

CREATE TABLE #Temp(
 ID int IDENTITY PRIMARY KEY,
 PK /*heregoesPKtype*/
)

INSERT INTO #Temp SELECT PK FROM Table ORDER BY SortColumn

SELECT FROM Table JOIN # Temp temp ON Table.PK = temp .PK ORDER BY temp .ID WHERE ID > @StartRow AND ID< @EndRow

  通过把所有的行拷贝到临时表中,我们可以对查询进一步的优化(SELECT TOP EndRow …),但是关键在于最坏情况——一个包含100万记录的表就会产生一个100万条记录的临时表考虑到这样的情况,再看看上面文章的结果,我决定在我的测试中放弃该方法

  升序-降序

  这个方法在子查询中使用默认排序,在主查询中使用反向排序,原理是这样的:

DECLARE @temp TABLE(
 PK /* PKType */
 NOT NULL PRIMARY
)

INSERT INTO @temp SELECT TOP @PageSize PK FROM
(
 SELECT TOP(@StartRow + @PageSize )
 PK,
 SortColumn /* If sorting column is defferent from the PK,SortColumn must
 be fetched as well,otherwise just the PK is necessary
 */

 ORDER BY SortColumn
 /*
  defaultorder–typicallyASC
 */
)

ORDER BY SortColumn
/*
reversed default order–typicallyDESC
*/

 SELECT FROM Table JOIN @Temp temp ON Table .PK= temp .PK
 ORDER BY SortColumn
 /*
  defaultorder
 */


  

本新闻共4页,当前在第1页  1  2  3  4  

编辑:xker.com

上一篇:ASP.NET1.0升级ASP.NET2.0的问题总结
下一篇:没有了
关闭窗口】【技术交流】【收藏此页
相关文章
·ASP.NET1.0升级ASP.NET2.0的问题总结·Asp.Net细节性问题回答精萃·十天学会ASP.net之第二天
·10天学会ASP.net之第一天·ASP.NET页面间的传值的几种方法·ASP.NET:掌握Web窗体的生命周期与状态
·ASP.NET入门随想之多态、接口与委托·AJAX+ASP.NET解决网页打开等待问题·关于ASP,ASP.NET,VB.NET里的MD5加密函
·ASP.NET2.0应用中定制安全凭证之理论·ASP.NET入门随想六之大航海家·ASP.NET Web Matrix开发工具简介
·剖析ASP.NET2.0站点导航功能之建立导·ASP.NET入门随想之金庸群“粒”传·ASP.NET应用程序设计的10大技巧 
推荐文章 最新文章 热门文章
·ASP.NET中实现大结果集分页研讨
·java写的查找重复电话号码程序
·ASP.NET1.0升级ASP.NET2.0的问题总结
·在Linux操作系统中如何截获系统调用
·照片处理:美女肖像照片简单靓肤技巧
·PHP安全配置之实现安全的两个重点
·手工优化windows XP系统
·用 VC++和Winsock 实现与 HTTP 服务
·SQL Server 2005数据库开发概述
·Jsp开发环境配置全过程
·Fireworks制作妇女节主题宣传动画(图
·主动FTP与被动FTP-权威解释
·FTP连接后为什么列表错误,无法列表
·拒绝提示窗口 让操作自动赶走网络烦恼
·视频格式转换工具使用集锦
·ASP.NET中实现大结果集分页研讨
·常见网络问题解答与故障解决
·局域网病毒入侵原理及防范方法
·电脑病毒有哪些本质弱点
·防范病毒须先认识病毒
·计算机病毒触发条件
·计算机病毒传染的一般过程
·病毒知识详解
·Linux 的病毒发展史及分类
·国际上对病毒命名的惯例
·高手出招:从病毒命名识别病毒
·腾讯QQ空间花匠养花帮助手册
·QQ聊天记录器现身网络“防止第三者”
·QQ空间应用窍门和解答
·计算机病毒的破坏行为
·个人简历表格
·免费代理IP(每日更新)
·QQ密码丢失后能做的事情:快速找回密码
·Norton AntiVirus 2006 注册码(激活
·豪杰超级解霸V9.1正版注册码
·WinRAR 3.51 注册码
·系统优化 专题
·找回QQ密码的注意事项 
·史上最强QQ个人档案资料欣赏
·Ajax技术开发指南
·求职简历封皮
·最经典的黑客入门教材
·ACDSee v8.0注册码
·应届毕业生求职信
·怎样查找对方的IP地址
评论

设为首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003-2006 xker.com All rights reserved.小新技术网 合作广告QQ:12231446
本页浏览次数: