Sql Server分页分段查询百万级数据四种项目实例
实际项目中需要实现自定义分页,最关键第一步就是写分页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分页分段查询百万级数据四种项目实例的更多相关文章
- SQL Server 分页语句查询
--查询第10页的数据(15条) SELECT TEMP1.* FROM( SELECT TOP 15 ROW_NUMBER() OVER(ORDER BY ID ASC) AS ROWID,* FR ...
- SQL server分页的四种方法(算很全面了)
这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...
- EF查询百万级数据的性能测试--多表连接复杂查询
相关文章:EF查询百万级数据的性能测试--单表查询 一.起因 上次做的是EF百万级数据的单表查询,总结了一下,在200w以下的数据量的情况(Sql Server 2012),EF是可以使用,但是由于 ...
- 二、SQL Server 分页
一.SQL Server 分页 --top not in方式 select top 条数 * from tablename where Id not in (select top 条数*页数 Id f ...
- SQL SERVER 分页方法
最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- SQL Server多条件查询的实现
SQL Server多条件查询的实现 SQL Server多条件查询我们经常会用到,下面就教您如何使用存储过程实现SQL Server多条件查询,希望对您学习SQL Server多条件查询方面有所帮助 ...
- SQL Server分页模板
SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...
- 解决hibernate对Sql Server分页慢的问题
一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...
随机推荐
- ASP.NET Core 2.2 基础知识(十五) Swagger
安装 Nuget 包 注册 Swagger public void ConfigureServices(IServiceCollection services) { services.AddMvc() ...
- java中的JDBC
Java 是通过 JDBC 技术实现对各种数据库访问的,换句话说,JDBC 充当了 Java 应用程 序与各种不同数据库之间进行对话的媒介. JDBC 是 Java 数据库连接(Java DataBa ...
- java.lang.NoSuchMethodError:org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session
项目配置了spring 4.0.6.RELEASE 和hibernate4.2.0.Final ,出错原因是因为在Spring 3.1开始没有了HibernateDaoSupport类,而我的却Dao ...
- 【并查集】bzoj2054 疯狂的馒头
因为只有最后被染上的颜色会造成影响,所以倒着处理,用并查集维护已经染色的区间的右端点,即fa[i]为i所在的已染色区间的右端点,这样可以保证O(n)的复杂度. #include<cstdio&g ...
- 定时任务-crontab
一.crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动c ...
- Linux下的echo输出换行符
echo -e "text1\ntext2" -e表示开启转移字符
- 如何设断点????-----使用WinDbg调试SQL Server查询
http://www.cnblogs.com/woodytu/p/4665427.html http://www.sqlservercentral.com/blogs/aschenbrenner/20 ...
- RabbitMq_05_Topics
Topics (using the .NET client) Prerequisites This tutorial assumes RabbitMQ isinstalled and running ...
- sun.misc.BASE64Decoder导入异常及处理思路
Java后台保存base64图片数据 使用byte[] bytes = new BASE64Decoder().decodeBuffer(str);需要引入sun.misc.BASE64Decoder ...
- Android中关闭DatePicker和NumberPicker等Picker类的可编辑模式
DatePicker.TimePicker.NumberPicker等控件在由于默认是可编辑的,所以会经常跳出键盘.要屏蔽这些编辑模式只需要如下代码: picker.setDescendantFocu ...