`
灵雨飘零
  • 浏览: 35030 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

create database DBTest
use DBTest

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

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

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

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




--写法2,not exists
select 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/top
select top 50 * from pagetest
where 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)a
where rownumber>9900

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

select * from 
(select row_number()over(order by id)rownumber,* from pagetest)a
where 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
)b
where rownumber>9900

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

测试sql:

declare @begin_date datetime
declare @end_date datetime
select @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,nvarch,datetime类型字段,也可以试试。不过对于非主键没索引的大数据量排序效率肯定是很坑爹的。


分享到:
评论

相关推荐

    Oracle 3种分页SQL方法比较

    本文将详细探讨三种常用的Oracle分页SQL方法:ROWNUM、ROWNUM结合子查询以及新引入的Oracle 12c的FETCH NEXT WITH OFFSET语法。这三种方法各有优缺点,适用于不同的场景。 1. ROWNUM方法: ROWNUM是Oracle中最基础...

    sql的分页处理,海量数据的提取效率分析

    首先,我们要了解SQL的几种常见的分页方式。最基础的是使用`OFFSET`和`FETCH`关键字,这种方法直观且易于理解,但当数据量巨大时,由于需要跳过大量行,性能会显著下降。另一种常见方法是基于`ROW_NUMBER()`窗口函数...

    sql分页查询几种写法

    以下将详细介绍几种常见的SQL分页查询方法。 1. **Not In / Top 方法** 这种方法通过`NOT IN`子查询配合`TOP`来实现分页。首先,获取需要排除的前n条记录,然后在主查询中排除这些记录,从而得到分页后的结果。...

    sql分页的几种方法

    本文将详细介绍几种常用的SQL分页技术,主要适用于SQL Server 2000及以后版本。 #### 方法一:使用`ROW_NUMBER() OVER ()` **示例代码**: ```sql WITH temp AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY NodeID...

    用SQL实现分页的三种方法

    ### 用SQL实现分页的三种方法 在数据库管理中,分页是一项常见的需求,尤其在处理大量数据时,能够有效地提升用户体验并减轻服务器负担。本文将详细介绍如何使用SQL实现分页功能,并针对三种不同的分页策略进行深入...

    sql server分页技术(SQL Server 与Access数据库相关分页技术)

    以下是几种常用的SQL Server分页技术: 1. **TOP 和 NOT IN** 分页: 这种方法通过`TOP`关键字选取指定数量的记录,然后使用`NOT IN`子句排除已选取的记录。例如,查询第二页的记录,可以先选取前`@RecordStart`个...

    分页的sql总结

    以下是对分页SQL查询技术的深入解析,旨在帮助读者理解并掌握几种常用的分页查询方法。 ### 1. 使用ROWID进行分页 ROWID是一个特殊的数据类型,用于唯一标识表中的每一行记录。利用ROWID进行分页查询,可以避免多...

    几款通用的sql分页存储过程

    ### 几款通用的SQL分页存储过程:深入解析与应用 在数据库操作中,分页查询是一项常见的需求,尤其当数据量庞大时,合理的分页可以极大地提高查询效率和用户体验。本文将深入分析两款通用的SQL分页存储过程,分别...

    T-SQL经典分页语句

    综上所述,T-SQL提供了多种方式来实现分页查询,包括单表分页、单表有条件分页以及多表分页,每种方法都有其适用场景和优缺点。开发者应根据实际需求和数据量大小选择最合适的分页策略,以达到最佳的性能和用户体验...

    SQL Server 分页方案比拼

    本文将深入探讨SQL Server中几种常见的分页方案,并对它们进行比较分析。 ### 1. 基于子查询的分页方法 一种常用的分页策略是通过子查询来实现。具体做法是在外层查询中使用`TOP`关键字选取一定数量的记录,而在内...

    用标准的SQL语句实现查询记录分页

    下面,我们将详细解析几种实现SQL分页查询的方法,并探讨其适用场景。 ### 方法一:使用TOP子句与ROWCOUNT 对于支持`TOP`子句的数据库系统(如SQL Server),可以利用`TOP`来限制返回的行数,再结合`ROWCOUNT`设置...

    oracle分页查询sql

    #### 四、基于ROWNUM的分页查询的两种方式比较 对于上述分页查询,有两种不同的实现方式: 1. **方式一**:通过内外两层`WHERE`子句分别控制每页的最大值和最小值。 ```sql SELECT * FROM ( SELECT A.*, ROWNUM ...

    大数据量时提高分页的效率

    在处理大数据量时,分页是一种常见的优化策略,它能够有效地管理和展示数据,避免一次性加载过多的数据导致性能下降。本文主要讨论如何在大数据量下提高分页的效率,重点关注自定义分页的方法。 默认分页是一种简单...

    Sql server 分页存储过程的性能对比

    这些方法各有优劣,具体到存储过程,我们可以比较以下几种常见策略: 1. **ROW_NUMBER() 函数**: 使用`ROW_NUMBER()`窗口函数可以为结果集中的每一行分配一个唯一的行号,结合`OFFSET`和`FETCH NEXT`语句实现分页...

    SQL分页之类的东西

    在SQL Server中,有几种常见的分页实现方式: 1. **ROW_NUMBER() 函数**:这是SQL Server 2005引入的一个窗口函数,它可以为查询结果集中的每一行生成一个唯一的行号。通过结合`ROW_NUMBER()`、`OVER()`和`WHERE`...

    分页算法 AspNetPager 分页实例 分页sql语句

    常见的分页算法有以下几种: 1. **基于RowNum的分页**:在SQL Server中,可以使用ROW_NUMBER()函数结合OVER子句实现分页。通过设置PARTITION BY和ORDER BY,确定每一页的数据顺序,并通过WHERE子句筛选出指定范围的...

    在SQL Server中通过SQL语句实现分页查询

    在数据库应用开发中,分页查询是一种常见的技术手段,用于改善用户体验并提高系统性能。特别是当数据量庞大时,一次性加载所有数据到前端不仅会导致页面响应速度慢,还可能因为数据量过大而消耗过多内存资源。因此,...

    jdbc 分页 sql语句

    本篇文章将通过具体的例子来介绍如何使用JDBC实现SQL分页查询。 #### 二、基础知识回顾 1. **ROWNUM函数**:在Oracle数据库中,`ROWNUM`是一个特殊的伪列,它为结果集中的每一行分配一个唯一的数字,从1开始递增。...

    各数据库分页语法支持

    不同的数据库系统提供了不同的分页机制,本文将详细介绍几种常见数据库(Oracle、DB2、SQL Server、PostgreSQL)的分页语法支持,并给出具体的示例。 #### Oracle 数据库分页 Oracle 支持多种分页方式,包括三层...

    sql 分页存储过程

    分页查询是数据库中常用的一种技术,它允许用户按需获取数据,通常以每页的形式展示,例如常见的每页10条或20条记录。在没有存储过程的情况下,我们通常会使用LIMIT和OFFSET关键字(在MySQL中)或TOP和SKIP关键字...

Global site tag (gtag.js) - Google Analytics