常用SQL Server分页方式

假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR无索引,Sqlserver版本:2008R2

第一种方案、最简单、普通的方法:

SELECT TOP 30 *
  FROM [ARTICLE]
 WHERE ID NOT IN ( SELECT TOP 45000 ID
                     FROM [ARTICLE]
                    ORDER BY YEAR DESC
                             ,ID DESC )
 ORDER BY YEAR DESC
          ,ID DESC 

第二种方案:

SELECT *
  FROM( SELECT TOP 30 *
          FROM ( SELECT TOP 45030 *
                   FROM ARTICLE
                  ORDER BY YEAR DESC
                           ,ID DESC ) f
         ORDER BY f.YEAR ASC
                  ,f.ID DESC ) s
 ORDER BY s.YEAR DESC
          ,s.ID DESC 

第三种方案:

SELECT *
  FROM ARTICLE w1
       ,( SELECT TOP 30 ID
            FROM ( SELECT TOP 50030 ID
                                    ,YEAR
                     FROM ARTICLE
                    ORDER BY YEAR DESC
                             ,ID DESC ) w
           ORDER BY w.YEAR ASC
                    ,w.ID ASC ) w2
 WHERE w1.ID = w2.ID
 ORDER BY w1.YEAR DESC
          ,w1.ID DESC 

第四种方案:

SELECT *
  FROM ARTICLE w1
 WHERE ID IN
       ( SELECT TOP 30 ID
           FROM ( SELECT TOP 45030 ID
                                   ,YEAR
                    FROM ARTICLE
                   ORDER BY YEAR DESC
                            ,ID DESC ) w
          ORDER BY w.YEAR ASC
                   ,w.ID ASC )
 ORDER BY w1.YEAR DESC
          ,w1.ID DESC 

第五种方案:

SELECT w2.n
       ,w1.*
  FROM ( SELECT TOP 50030 Row_number() OVER (ORDER BY YEAR DESC, ID DESC) n
                          ,ID
           FROM ARTICLE ) w2
       ,ARTICLE w1
 WHERE w1.ID = w2.ID
       AND w2.n > 50000
 ORDER BY w2.n ASC 

在查询页数靠前时,效率3>4>5>2>1,页码靠后时5>4>3>1>2,再根据用户习惯,一般用户的检索只看最前面几页,因此选择3 4 5方案均可,若综合考虑方案5是最好的选择

时间: 2024-10-29 16:28:49

常用SQL Server分页方式的相关文章

SQL Server分页方式、ISNULL与COALESCE性能比较(八)

前言 上一节我们讲解了数据类型以及字符串中几个需要注意的地方,这节我们继续讲讲字符串行数同时也讲其他内容和穿插的内容,简短的内容,深入的讲解. 分页方式 在SQL 2005或者SQL 2008中我们是利用ROW_NUMBER开窗函数来进行分页的,关于开窗函数,我们在SQL进阶中会详细讲讲.如下: USE TSQL2012 GO DECLARE @StartRow INT DECLARE @EndRow INT SET @StartRow = 31 SET @EndRow = 40 SELECT

数据库开发 常用sql server 规范集锦

常用 SQL Server 规范集锦 来源:静逸 链接:www.cnblogs.com/liyunhua/p/4534442.html 常见的字段类型选择   1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自增长标识建议采用bigint数据类型   (数据量一大,用int类型就装不下,那以后改造就麻烦了) 5.时间类型建议采用为datetime数据类型 6.禁止使用text.ntext.ima

自己整理的常用SQL Server 2005 语句、

--创建数据库 create database 数据库 go --打开数据库 use 数据库 --删除数据库 drop database 数据库 Go --创建数据表 create table 数据表 ( 列名1  数据类型1  限定条件(是否是主外键.是否为空), 列名2  数据类型2  限定条件(是否是主外键.是否为空) )go --删除数据表 drop table 数据表 --插入数据 --插入单行数据 insert  into 表名 [(列名1,列名2 )]  values  (‘数据1

二、SQL Server 分页

一.SQL Server 分页 --top not in方式 select top 条数 * from tablename where Id not in (select top 条数*页数 Id from tablename) --ROW_NUMBER() OVER()方式 select * from ( select *, ROW_NUMBER() OVER(Order by Id ) AS RowNumber from tablename ) as b where RowNumber BE

解决hibernate对Sql Server分页慢的问题

一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: Java代码   public Query setMaxResults(int maxResults); public Query setFirstResult(int firstResult); 只要调用了这两个方法并设置好参数,hibernate自动分页完全屏蔽了底层数据库分页技术,这也是众多开

SQL SERVER 分页方法

    最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的文章.看过之后,感觉自己之前写的语句,太低端,太不科学了.  文章中讲了两种分页方法,其中一种只适用于SQL SERVER2012以上版本.   ROW_NUMBER()函数分页  先介绍一下ROW_NUMBER()函数,这个函数的主要作用,从它的命名中就可看出来.ROW,每列,NUMBER

SQL server分页的四种方法(算很全面了)

目录: 文章目录 方法一:三重循环 思路 代码实现 查询出的结果及时间 方法二:利用max(主键) 代码实现 查询出的结果及时间 方法三:利用row_number关键字 SQL实现 查询出的结果及时间 第四种方法:offset /fetch next(2012版本及以上才有) 代码实现 结果及运行时间 封装的存储过程 总结 ??这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及

常用 SQL Server 规范集锦

常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自增长标识建议采用bigint数据类型   (数据量一大,用int类型就装不下,那以后改造就麻烦了) 5.时间类型建议采用为datetime数据类型 6.禁止使用text.ntext.image老的数据类型 7.禁止使用xml数据类型.varchar(max).nvarchar(max) 约束与索引 每张表必须有主键 每张表必须

[转载]常用 SQL Server 规范集锦

转载者注:据说是某公司(携程)内部规范. 常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 4.自增长标识建议采用bigint数据类型   (数据量一大,用int类型就装不下,那以后改造就麻烦了) 5.时间类型建议采用为datetime数据类型 6.禁止使用text.ntext.image老的数据类型 7.禁止使用xml数据类型.varchar(max).nvarchar(max)