实际项目中需要实现自定义分页,最关键第一步就是写分页SQL语句,要求语句效率要高。

那么本文的一个查询示例是查询第100000-100050条记录,即每页50条的结果集。查询的表名为infoTab,且id为整型自增主键字段。

第一种、使用NOT IN关键字

SELECT TOP 50 * FROM infoTab WHERE ID NOT IN(SELECT TOP 100000 ID FROM infoTab)

平均查询时间0.1s。这是非常简单的一种写法,效率还可以,只是使用默认ID排序,如果ID有间断,展示效果不好。

第二种、通过升序与降序方式实现分页查询

SELECT * FROM (SELECT TOP 50 * FROM (SELECT TOP 100050 * FROM infoTab ORDER BY ID ASC)TEMP1 ORDER BY ID DESC)TEMP2 ORDER BY ID ASC

平均查询时间0.22s。这种是利用先查询倒序的50个数据,最后又进行升序排序的方法很复杂,不推荐使用,也最浪费时间,效率最低。

第三种、采用MAX(ID)函数

实际是关于MIN()函数和MAX()函数的使用

SELECT TOP 50 * FROM infTab WHERE ID>(SELECT MAX(ID) FROM (SELECT TOP 100000 ID FROM infoTab ORDER BY ID)temp) 

平均查询时间0.13s。这种方法理解起来很简单,就是直接使用MAX()进行查找,然后id大于MAX()结果为100000的前50条记录即为结果。

第四种、最后一种推荐使用的方法,使用ROW_NUMBER

正如Oracle的rowid,解决了整型的ID字段不连续的问题。用行号(ROW_NUMBER)查询,比较高效的查询方式,只有在SQL Server2005或更高版本才支持。

注意的是,ROW_NUMBER后面必须跟着OVER(ORDER BY [FIELD]),我们来看具体的写法。

SELECT * FROM (SELECT TOP 100050 ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000

平均运行时间0.29s。这种方法的好处是实现连续的排序ROWID,避免了ID间断不连续的问题,展示更加美观。

  在这里面需要注意的是OVER的括号里面可以写多个排序字段,比如:OVER(ORDER BY CreatedTime, ID)。

如果使用下面这条语句更高效,是上面语句运行时间的三分之一,平均运行时间仅0.08s。

SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000 AND t.rowid <= 100050

总之,我们推荐使用第四种方法中的后面一条语句,查询效率高,而且展示结果美观,ROWID连续,尤其在千万级数据查询的时候,效率相差很大非常大。

(所有SQL语句实测通过,可直接在项目中使用。)

Sql Server分页分段查询百万级数据四种项目实例的更多相关文章

  1. SQL Server 分页语句查询

    --查询第10页的数据(15条) SELECT TEMP1.* FROM( SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,* FR ...

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

      这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...

  3. EF查询百万级数据的性能测试--多表连接复杂查询

    相关文章:EF查询百万级数据的性能测试--单表查询 一.起因  上次做的是EF百万级数据的单表查询,总结了一下,在200w以下的数据量的情况(Sql Server 2012),EF是可以使用,但是由于 ...

  4. 二、SQL Server 分页

    一.SQL Server 分页 --top not in方式 select top 条数 * from tablename where Id not in (select top 条数*页数 Id f ...

  5. SQL SERVER 分页方法

    最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ...

  6. Sql Server 存储过程中查询数据无法使用 Union(All)

    原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...

  7. SQL Server多条件查询的实现

    SQL Server多条件查询的实现 SQL Server多条件查询我们经常会用到,下面就教您如何使用存储过程实现SQL Server多条件查询,希望对您学习SQL Server多条件查询方面有所帮助 ...

  8. SQL Server分页模板

    SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...

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

    一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...

随机推荐

  1. 详解Oracle数据货场中三种优化:分区、维度和物化视图

    转 xiewmang 新浪博客 本文主要介绍了Oracle数据货场中的三种优化:对分区的优化.维度优化和物化视图的优化,并给出了详细的优化代码,希望对您有所帮助. 我们在做数据库的项目时,对数据货场的 ...

  2. codeforces 869C The Intriguing Obsession【组合数学+dp+第二类斯特林公式】

    C. The Intriguing Obsession time limit per test 1 second memory limit per test 256 megabytes input s ...

  3. 有向图强连通分量的Tarjan算法及模板

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强联通(strongly connected),如果有向图G的每两个顶点都强联通,称有向图G是一个强联通图.非强联通图有向 ...

  4. POJ1325Machine Schedule(匈牙利算法)

                                                          Machine Schedule Time Limit: 1000MS   Memory L ...

  5. POJ1251 Jungle Roads(Kruskal)(并查集)

    Jungle Roads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23882   Accepted: 11193 De ...

  6. ASP.NET Core 2.2 基础知识(十) Web服务器 - Kestrel

    ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中. ASP.NET ...

  7. [ARC100]E:Or Plus Max(FZT)

    https://arc100.contest.atcoder.jp/tasks/arc100_c 一个很自然的想法是,对于每个K求出i or j=k的所有a[i]+a[j]的最大值ans[k],答案就 ...

  8. 生成随机位数的UUID

    1,生成UUID package com.jeeplus.common.utils; import java.util.UUID; /** * 生成唯一的UUID * * @author songya ...

  9. POP3、IMAP、SMTP邮件协议的理解

    一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 CSDN博客链接: http://blog.csdn.net/my_confesser    正文   今天入职配置OutLook的时候,看到公司的 ...

  10. 【spring data jpa】jpa中使用count计数方法

    spring data jpa中使用count计数方法很简单 直接在dao层写方法即可 int countByUidAndTenementId(String parentUid, String ten ...