当前位置: 首页 > news >正文

DataGrid连接Access的快速分页法(1)——需求与现状

DataGrid连接Access的快速分页法(1)——需求与现状

一、需求分析

DataGrid是一个功能强大的ASP.NET Web服务器端控件,它除了能够按各种方式格式化显示数据,还可以对数据进行动态的排序、编辑和分页。大大减轻了广大Web程序员的工作量。实现DataGrid的分页功能一直是很多入门者感到棘手的问题,特别是自定义分页功能,实现的方法多种多样,非常灵活。
目前大家公认性能最好的应该数SQL Sever结合存储过程的解决方案。因为在SQL Server的存储过程里面可以使用游标(Cursor)来遍历数据库表中所有的行,结合一个计数器变量就可以快速定位到数据库表中的某一行了。但是在采用Access数据库的ASP.NET应用程序中,一直没有一种较好的解决方案。
我们知道,在ASP中可以使用ADO的游标来快速定位当前页面的数据在数据库表中的位置。可是ADO.NET中没有游标这个东西,所以传统的DataGrid分页方法都是用诸如“SELECT * FROM Item”的SQL语句从数据库表中取出所有的记录,然后DataGrid的自动分页功能会帮你显示相应分页的数据。

二、目前的解决方案

很多人已经意识到了上面描述的问题,并提出了解决方法,即采用自定义分页,每次从数据库表中取出要显示的数据。那么,怎样取呢?答案就我知道的大概有5种以上吧。使用不同的算法,将会得到不同的效率。经过我粗略的测试,最慢的算法耗费的时间大概是最快的3倍!而且这个数字会随着记录总数的增加而增加。
为了方便接下来的讨论,在展示 SQL 语句之前,首先让我们做如下约定:
PageIndex

ItemId

ProductId

Price

0

001

0011

$12

002

0011

$13

003

0011

$12

1

004

0012

$13

005

0012

$11

006

0012

$14

2

007

0013

$14

008

0013

$12

009

0014

$13

3

010

0011

$13

011

0012

$15

012

0014

$16

4

013

0013

$12

014

0013

$13

变量
用途
@PageSize
每页显示的记录总数
@PageCount
分页总数
@RecordCount
数据表的记录总数
@PageIndex
当前页的索引
@FirstIndex
第一页的索引
@MiddleIndex
中间页的索引
@LastIndex
最后一页的索引
@TableName
数据库表名称
@PrimaryKey
主键字段名称
@QueryFields
要查询的字段集
@Condition
筛选条件
定义:
@PageCount = ( int ) Math . Ceiling (( double ) @RecordCount / @PageSize )
@FirstIndex = 0
@LastIndex = @PageCount - 1
@MiddleIndex = ( int ) Math. Ceiling (( double ) @PageCount / 2 ) – 1
预设:
@PageSize = 2
@RecordCount = 9
@PageCount = 4
现在先让我们来看看速度最慢的 SQL 语句:
SELECT TOP @PageSize * FROM @TableName AS a
WHERE @PrimaryKey NOT IN (
SELECT TOP @PageSize * @PageIndex @PrimaryKey FROM @TableName AS b
ORDER BY @PrimaryKey
)
ORDER BY @PrimaryKey
这条语句慢就慢在 NOT IN 这里,主 SELECT 语句遍历的每个 @PrimaryKey 的值都要跟子 SELECT 语句的结果集中的每一个 @PrimaryKey 的值进行比较,这样时间复杂度非常大。其实我们平时编写 SQL 语句的时候应该尽量避免用 NOT IN 语句,因为它往往会提高整个 SQL 语句的时间复杂度。
还有一种是用两个 TOP 的 SQL 语句,如下所示:
SELECT * FROM (
SELECT TOP @PageSize * FROM (
SELECT TOP @PageSize *( @PageIndex + 1 ) * FROM @TableName
ORDER BY @PrimaryKey
) TableA
ORDER BY @PrimaryKey DESC
) TableB
ORDER BY @PrimaryKey
这条 SQL 语句空间复杂度比较大。如果要显示的分页面刚好是最后一页,那么它的效率比直接SELECT 出所有的记录还要低。
下一篇将详细介绍一种最快的算法,并根据不同情况,采用不同的变形来有效的提高查询效率。
作者:黎波

相关文章:

  • 自动驾驶:使用 3D 时空卷积网络的自监督点云预测
  • 文件共享的新面孔——《纽约时报》专访BitTorrent之父
  • 实战OpenPose项目1:开篇使用文档
  • 实战OpenPose项目2:开发环境配置与demo运行
  • Martin Fowler:设计已死?
  • 实战OpenPose项目3:pytorch 实现openpose(包括手和身体姿态估计)
  • 下一步CSDN Blog要增加和完善的功能
  • 实战OpenPose项目4:实时准确的全身多人姿态估计和跟踪系统
  • 知识图谱:知识表示学习(KRL)/知识嵌入(KE)必读论文
  • 关于国际标准书号ISBN
  • AI模型设计:C语言版 TensorFlow2.x安装与使用
  • AI模型设计必备:PyTorch与TensorFlow模型C++与python实现学习资料
  • 手机拍摄的书页
  • linux:bash和sh区别
  • AI模型设计:完美demo实现C调用python的tensorflow模型pb(附件源码python与C/C++动态库互相调用)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CentOS从零开始部署Nodejs项目
  • C学习-枚举(九)
  • ES6核心特性
  • Git学习与使用心得(1)—— 初始化
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • React-flux杂记
  • tweak 支持第三方库
  • 我是如何设计 Upload 上传组件的
  • 延迟脚本的方式
  • 一文看透浏览器架构
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Hibernate主键生成策略及选择
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • PostgreSQL之连接数修改
  • # Maven错误Error executing Maven
  • #pragma data_seg 共享数据区(转)
  • $.each()与$(selector).each()
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (day 12)JavaScript学习笔记(数组3)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计高校学生选课系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)鸿鹄云架构一服务注册中心
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转) ns2/nam与nam实现相关的文件
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .“空心村”成因分析及解决对策122344
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .apk 成为历史!
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net mvc 获取url中controller和action
  • .net MVC中使用angularJs刷新页面数据列表