DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)

access|datagrid|分页|语句

DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)
一、相关概念
在 ACCESS 数据库中,一个表的主键(PRIMARY KEY,又称主索引)上必然建立了唯一索引(UNIQUE INDEX),因此主键字段的值是不会重复的。并且索引页依据索引列的值进行排序,每个索引记录包含一个指向它所引用的数据行的指针。我们可以利用主键这两个特点来实现对某条记录的定位,从而快速地取出某个分页上要显示的记录。

举个例子,假设主键字段为 INTEGER 型,数据库表中的记录已经按主键字段的值升序排好,那么主键字段的值为“11”的记录肯定刚好在值为“12”的记录前面(假设数据库表中存在主键的值为“12”的记录)。如果主键字段不具备 UNIQUE 约束,数据库表中将有可能存在两个或两个以上主键字段的值为“11”的记录,这样就无法确定这些记录之间的前后位置了。

下面就让我们看看如何利用主键来进行数据的分段查询吧。
二、升序
(1)@PageIndex <= @FirstIndex

取第一页的数据是再简单不过了,我们只要用TOP @PageSize 就可以取出第一页要显示的记录。因为数据表中的记录已经按主键字段的值升序排好,所以省去了 ORDER BY 子句,速度更快。

SELECT TOP @PageSize @QueryFields
FROM @TableName
WHERE @Condition
-- ORDER BY @PrimaryKey ASC

如图:@PageIndex = 0

(2)@FirstIndex < @PageIndex <= @MiddleIndex

把取数据表前半部分记录和取后半部分记录的 SQL 语句分开写,可以有效地改善性能。后面我再详细解释这个问题。现在看看取前半部分记录的 SQL 语句。先取出当前页之前的所有记录的主键值,再从中选出最大值,然后取出主键值大于该最大值的前 @PageSize 条记录。值得注意的是,这里省去了两个 ORDER BY @PrimaryKey ASC 语句,分别在最里面和最外面的 SELECT 语句。前面已经说过,数据库表中的记录已经按主键字段的值升序排好,所以我们没有必要画蛇添足。

SELECT TOP @PageSize @QueryFields
FROM @TableName
WHERE @PrimaryKey > (
SELECT MAX(@PrimaryKey) FROM (
SELECT TOP @PageSize*@PageIndex @PrimaryKey
FROM @TableName
WHERE @Condition
-- ORDER BY @PrimaryKey ASC
) TableA
) WHERE @Condition
-- ORDER BY @PrimaryKey ASC

例如:@PageIndex = 1 ,红 --> 黄 --> 蓝

(3)@MiddleIndex < @PageIndex < @LastIndex

接下来看看取数据表后半部分记录的 SQL 语句。该语句跟前面的语句算法的原理是一样的,只是方法稍微不同。

先取出当前页之后的所有记录的主键值,再从中选出最小值,然后取出主键值小于该最小值的前 @PageSize 条记录。

SELECT * FROM (
SELECT TOP @PageSize @QueryFields
FROM @TableName
WHERE @PrimaryKey < (
SELECT MIN(@PrimaryKey) FROM (
SELECT TOP (@RecordCount-@PageSize*(@PageIndex+1)) @PrimaryKey
FROM @TableName
WHERE @Condition
ORDER BY @PrimaryKey DESC
) TableA
) WHERE @Condition
ORDER BY @PrimaryKey DESC
) TableB
ORDER BY @PrimaryKey ASC

之所以把取数据表前半部分记录和取后半部分记录的 SQL 语句分开写,是因为使用取前半部分记录的 SQL 语句时,当前页前面的记录数目随页数递增,而我们还要从这些记录中取出它们的主键字段的值再从中选出最大值。这样一来,分页速度将随着页数的增加而减慢。因此我没有这样做,而是在当前页索引大于中间页索引时(@MiddleIndex < @PageIndex)选用了分页速度随着页数的增加而加快的算法。由此可见,假设把所有分页面划分为前面、中间和后面三部分,则最前面和最后面的分页速度最快,最中间的分页速度最慢。

例如:@PageIndex = 3 ,红 --> 黄 --> 蓝

(4)@PageIndex >= @LastIndex

取最后一页的记录时要先计算出该页的记录数,作为 TOP 语句的条件,而不能直接用 TOP @PageSize,这样取出来的记录并不只是最后一页的。其实很多网站确实这样做。

SELECT * FROM (
SELECT TOP (@RecordCount-@PageSize*@LastIndex) @QueryFields
FROM @TableName
WHERE @Condition
ORDER BY @PrimaryKey DESC
) TableA
ORDER BY @PrimaryKey ASC

例如:@PageIndex = 4

时间: 2024-12-27 16:31:59

DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)的相关文章

DataGrid连接Access的快速分页法(3)——SQL语句的选用(降序)

access|datagrid|分页|语句 DataGrid连接Access的快速分页法(3)--SQL语句的选用(降序)三.降序(1)@PageIndex <= @FirstIndexSELECT TOP @PageSize @QueryFields FROM @TableName WHERE @ConditionORDER BY @PrimaryKey DESC (2)@FirstIndex < @PageIndex <= @MiddleIndex SELECT TOP @PageS

DataGrid连接Access的快速分页法(4)——动态生成SQL语句

access|datagrid|动态|分页|语句 DataGrid连接Access的快速分页法(4)--动态生成SQL语句using System;using System.Text;namespace Paging{ /// <summary> /// FastPaging 的摘要说明. /// </summary> public class FastPaging { private FastPaging() { } /// <summary> /// 获取根据指定字

DataGrid连接Access的快速分页法(5)——实现快速分页

access|datagrid|分页 DataGrid连接Access的快速分页法(5)--实现快速分页 我使用Access自带的Northwind中文数据库的"订单明细"表作为例子,不过我在该表添加了一个名为"Id"的字段,数据类型为"自动编号",并把该表命名为"订单明细表". FastPaging_DataSet.aspx---------------------------------------------------

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

access|datagrid|分页 DataGrid连接Access的快速分页法(1)--需求与现状一.需求分析 DataGrid是一个功能强大的ASP.NET Web服务器端控件,它除了能够按各种方式格式化显示数据,还可以对数据进行动态的排序.编辑和分页.大大减轻了广大Web程序员的工作量.实现DataGrid的分页功能一直是很多入门者感到棘手的问题,特别是自定义分页功能,实现的方法多种多样,非常灵活. 目前大家公认性能最好的应该数SQL Sever结合存储过程的解决方案.因为在SQL Se

DataGrid基于Access的快速分页法

access|datagrid|分页 DataGrid是一个功能非常强大的ASP.NET Web服务器端控件,它除了能够方便地按各种方式格式化显示表格中的数据,还可以对表格中的数据进行动态的排序.编辑和分页.使Web开发人员从繁琐的代码中解放.实现DataGrid的分页功能一直是很多初学ASP.NET的人感到棘手的问题,特别是自定义分页功能,实现方法多种多样,非常灵活.本文将向大家介绍一种DataGird控件在Access数据库下的快速分页法,帮助初学者掌握DataGrid的分页技术. 目前的分

sql oracle-关于怎么快速执行10000条sql语句

问题描述 关于怎么快速执行10000条sql语句 由于我的数据库有几千万条数据,每一条查询都会花费0.5秒,但是10000条查询需要半个多小时,所以希望有快速一点的方法,求各位大神指点,下面是我的函数. /** * 这是一个横着的for循环,图的缩放级别是13,11*10方格,不同区域到不同区域的上车点数量 */ public static void CountListPointsOfOnetoOne() { ArrayList ListSql = new ArrayList(); double

ACCESS:跨数据库查询的SQL语句

access|数据|数据库|语句 问题说明:有时需要在两个或三个数据库的表中,通过相关关键字,查询获取所需记录集,用一般的SQL查询语句是实现不了的,可通过ACCESS的跨库查询功能实现.解决方法:例如"装材类型"和"装材"两张表是在不同的数据库中的,具体查询方法,如下:@"Select * from 装材类型 as a INNER JOIN [;database=" + AppDomain.CurrentDomain.BaseDirectory

浅谈mssql access数据库 top分页方法_MsSql

但是有利也有弊,它要求排序字段必须构成唯一记录,且select后的字段列表中,不允许出现与排序字段同名的字段.虽然sql2k5及以上版本已经提供了rownum()来进行分页处理,但是使用sql2k进行开发的还是较多的 复制代码 代码如下: uusing system.collections.generic;sing system;using system.text;/// <summary>/// 构造分页后的sql语句/// </summary>public static cla

浅谈mssql access数据库 top分页方法

但是有利也有弊,它要求排序字段必须构成唯一记录,且select后的字段列表中,不允许出现与排序字段同名的字段.虽然sql2k5及以上版本已经提供了rownum()来进行分页处理,但是使用sql2k进行开发的还是较多的复制代码 代码如下:uusing system.collections.generic;sing system;using system.text;/// <summary>/// 构造分页后的sql语句/// </summary>public static class