几种常见SQL分页方式效率比较

1.创建测试环境,(插入100万条数据大概耗时5分钟)。

create database DBTestuse DBTest

--创建测试表create table pagetest(id int identity(1,1) not null,col01 int null,col02 nvarchar(50) null,col03 datetime null)

--1万记录集declare @i intset @i=0while(@i<10000)begin    insert into pagetest select cast(floor(rand()*10000) as int),left(newid(),10),getdate()    set @[email protected]+1end

2.几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。

--写法1,not in/topselect top 50 * from pagetest where id not in (select top 9900 id from pagetest order by id)order by id

--写法2,not existsselect top 50 * from pagetest where not exists (select 1 from (select top 9900 id from pagetest order by id)a  where a.id=pagetest.id)order by id

--写法3,max/topselect top 50 * from pagetestwhere id>(select max(id) from (select top 9900 id from pagetest order by id)a)order by id

--写法4,row_number()select top 50 * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber>9900

select * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber>9900 and rownumber<9951

select * from (select row_number()over(order by id)rownumber,* from pagetest)awhere rownumber between 9901 and 9950

--写法5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号select *from (    select row_number()over(order by tempColumn)rownumber,*    from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a)bwhere rownumber>9900

2.分别在1万,10万(取1990页),100(取19900页)记录集下测试。

测试sql:

declare @begin_date datetimedeclare @end_date datetimeselect @begin_date = getdate()

<.....YOUR CODE.....>

select @end_date = getdate()select datediff(ms,@begin_date,@end_date) as ‘毫秒‘

1万:基本感觉不到差异。

10万:

100万:

结论:

1.max/top,ROW_NUMBER()都是比较不错的分页方法。相比ROW_NUMBER()只支持sql2005及以上版本,max/top有更好的可移植性,能同时适用于sql2000,access。

2.not exists感觉是要比not in效率高一点点。

3.ROW_NUMBER()的3种不同写法效率看起来差不多。

4.ROW_NUMBER() 的变体基于我这个测试效率实在不好。原帖在这里http://topic.csdn.net/u/20100617/04/80d1bd99-2e1c-4083-ad87-72bf706cb536.html

PS.上面的分页排序都是基于自增字段id。测试环境还提供了int,nvarchar,datetime类型字段,也可以试试。不过对于非主键没索引的大数据量排序效率应该是很不理想的。

时间: 2024-08-07 00:16:35

几种常见SQL分页方式效率比较的相关文章

几种常见SQL分页方式效率比较-转

原文地址:几种常见SQL分页方式效率比较 分页很重要,面试会遇到.不妨再回顾总结一下. 1.创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTestuse DBTest --创建测试表create table pagetest(id int identity(1,1) not null,col01 int null,col02 nvarchar(50) null,col03 datetime null) --1万记录集declare @i intset

企业宣传片制作几种常见的表现方式

企业宣传片制作几种常见的表现方式企业宣传片公司:企业宣传片制作几种常见的表现方式,以下是一些简单介绍,我们一起来看一下;事实说明的方式:商品宣传中最具说服力的表现手法,通过对使用者的采访,表达使用后的感受,来实际证明产品的功效和可信度.多用于新产品和特殊产品.根据实际情况以及生活的方式:在商品宣传中,将商品至于实际生活的场景,使受众领会商品的功能与概念.这种手法实际就是“描写生活水平的一个切面与商品互相之间密切关系.很直接的表达方式:是商品宣传片的最基本的表现形式,主要采用类似说明文格式,将有关

Java几种常见的编码方式

Java综合 几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言.由于人类的语言有太多,因而表示这些语言的符号太多,无法用计算机中一个基本的存储单元—— byte 来表示,因而必须要经过拆分或一些翻译工作,才能让计算机能理解.我们可以把计算机能够理解的语言假定为英语,其它语言要能够在计算机中使用必须经过一次翻译,把它翻译成英语.这个翻译的过程就是编

常见的三种SQL分页方式

--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 BETWEEN 当前页数-1*条

MySql、SqlServer、Oracle 三种数据库查询分页方式

SQL Server关于分页 SQL 的资料许多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是颠末预编译的,执行效率高,也更灵活.先看看单条 SQL 语句的分页 SQL 吧.方法1:适用于 SQL Server 2000/2005SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) O

Sql 分页查询效率分析

选取了2中效率比较高的方式比较效率:row_Number() .offset fetch 表test中有1000条数据,2个字段:field1(int),field2(nvarchar) --1000条数据,查询500次第1-10行,39s --1000条数据,查询500次第500-550行,87s --1000条数据,查询500次第150-160行,88s DECLARE @uId int SET @uId=1 BEGIN while @uId<=500 BEGIN SELECT * FROM

数据库中几种常见的分页操作

对数据进行分页处理是常常会用到的,在这里不阐述它们各个方法的效率性,此处记录方法 1.已知数据条数和每页条数 每页:10条 总数据:100条 需分页10页 select  top 10 * from  表名  where id not in (select top 100 id from 表名 order by id) 2.不知道数据总数 limit用法: limit 100   返回100条数据(返回100条数据,限制数据的数量) limit n 相当于 limit (0,n) select

几种常见的编码方式

ASCII编码:用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符. 拓展ASCII编码:用于表示更多的欧洲文字,用8个位存储数据,一共可以表示256个字符 GBK/GB2312/GB18030:表示汉字.GBK/GB2312表示简体中文,GB18030表示繁体中文. Unicode编码:包含世界上所有的字符,是一个字符集. UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度.

Java中几种常见的排序方式

冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 代码 /**   * 冒泡法排序<br/> * <li>比较相邻的元素.如果第一个比第二个大,就交换他们两个.</li>   * <li>对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点