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

原创 2004年03月08日 11:36:00

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
 
 
作者:黎波

高效率的Access\MSSQL分页的SQL语句

采用Access数据库有许多优点,比如数据库无须专门的数据库空间,使用,备份,迁移也非常方便。 但一旦数据量到达上万条,上十万条甚至更多的时候,ACCESS的大数据量的列表分页效率问题就出现了。 ...
  • qq269228887
  • qq269228887
  • 2013年10月31日 11:49
  • 705

Access2003和2007/2010中这样执行SQL语句

Access2007/2010中执行SQL语句的方法: 1、打开一个Access数据库文件   2、点击“创建”标签中的“查询设计”,会弹出一个“显示表”的对话框,点击“关闭”将其关闭   3、...
  • asanscape
  • asanscape
  • 2014年01月13日 18:43
  • 6949

easyui中的分页实现(支持MySQL,SQLServer,Oracle)

Pagination.java package com.dxwind.common.bean; import java.sql.CallableStatement; import java.sql....
  • sgx425021234
  • sgx425021234
  • 2014年02月21日 14:20
  • 5501

分页技术--sql语句的分页

常见分页的几种方式:                                                                                          ...
  • qq_30641447
  • qq_30641447
  • 2016年06月03日 11:09
  • 1897

分页:用sql语句分页

功能:根据时间段,查询相关数据 一、在java中,拼sql语句 String sql=" SELECT c.c_no, c.car_number, c.c_shelf_number, c....
  • Liucheng417
  • Liucheng417
  • 2016年05月27日 09:43
  • 1196

《SQLServer》------常用的分页查询语句

前言 在SqlServer中,分页查询是经常用到的查询语句,一个好的分页查询语句,不能能将代码省略,还能提高运行效率,下面我们来探讨一下SQLServer中的分页查询语句。 具体的业务逻辑是这样的,我...
  • u013067402
  • u013067402
  • 2016年10月24日 12:01
  • 5779

MyBatis中实现动态的SQL语句,分页以及mybatis的常用的配置

1.动态SQL:在SQL语句中加入流程控制。比如加入if,foreach等。  重点掌握if语句:  案例1:...
  • Future_IT_Daniel
  • Future_IT_Daniel
  • 2016年07月02日 11:49
  • 9182

几种常用数据库 分页查询的sql语句和简单分析

sqlserver分页 第一种分页方法 需用到的参数: pageSize 每页显示多少条数据 pageNumber 页数 从客户端传来 totalRecouds 表中的总记录数 se...
  • responsecool
  • responsecool
  • 2014年08月15日 09:45
  • 10088

高效的SQLSERVER分页查询(推荐)

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询...
  • qiaqia609
  • qiaqia609
  • 2014年11月24日 14:53
  • 152850

Access分页查询-双Top方式

namespace Eternal.Util {     ///     /// Access分页帮助类     ///     public static class AccessPagi...
  • xuweisen
  • xuweisen
  • 2013年12月12日 20:44
  • 953
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DataGrid连接Access的快速分页法(2)——SQL语句的选用(升序)
举报原因:
原因补充:

(最多只允许输入30个字)