`
冷寒冰
  • 浏览: 251551 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据库分页产生rownumber的几种方法及性能比较

Go 
阅读更多

在sqlsver查询分析器中直接运行即可(提示:运行时间大约30分钟) 如有需要请认真研究代码,会大有收获。

--change tools|options  setting to  discard  query results
set nocount on;
use testdb;
go
if object_id('dbo.RNBenchmark') is not null
drop table dbo.RNBenchmark;
go
if object_id('dbo.SalesBM') is not null
drop table dbo.SalesBM;
go
if object_id('dbo.SalesBMIdentity') is not null
drop  table dbo.SalesBMIdentity;
go
if object_id('dbo.SalesBMCursor')  is not null
drop table  dbo.salesBMCursor;
go
if object_id('dbo.RNTechniques') is not null
drop table dbo.RNTechniques;
create table dbo.RNTechniques
(
  tid int not null primary key,
  technique varchar(25) not null
);

insert into dbo.RNTechniques (tid,technique)values(1,'Subquery')
insert into dbo.RNTechniques (tid,technique)values(2,'Identity')
insert into dbo.RNTechniques (tid,technique)values(3,'Cursor')
insert into dbo.RNTechniques (tid,technique)values(4,'Row_Number')
go


create table  dbo.RNBenchmark
(
  tid         int not null  references  dbo.RNTechniques(tid),
  numrows     int not null,
  runtimemcs  bigint  not null,
  primary key(tid,numrows)
);
go

create table dbo.SalesBM
(
  empid  int not null  identity primary key,
  qty int not null
);
create index idx_qty_empid  on dbo.SalesBM(qty,empid);
go
create table  dbo.SalesBMIdentity(empid  int,qty int,rn int identity);
go

create table dbo.SalesBMCursor(empid int,qty int,rn int);
go

declare
@maxnumrows as int,
@steprows  as int,
@curnumrows as int,
@dt   as datetime;

set @maxnumrows=100000;
set @steprows=10000;
set @curnumrows=10000;

while  @curnumrows<=@maxnumrows
begin
truncate  table dbo.SalesBM;
insert  into   dbo.SalesBM(qty)
select cast(1+999.9999999999*rand(checksum(newid())) as int)
from dbo.Nums
where n<=@curnumrows;

--'subquery'
dbcc freeproccache with No_INFOMSGS;

dbcc DROPCLEANBUFFERS WITH NO_INFOMSGS;

SET @dt=getdate();--use sysdatetime() after to 2008

select  empid,qty,
(
   select count(*)
   from dbo.SalesBM as s2
   where s2.qty<s1.qty
   or
   (
      s2.qty=s1.qty  and s2.empid<=s1.empid
   )
)  as rn
from dbo.SalesBM as s1
order by qty,empid;


insert  into  dbo.RNBenchmark(tid,numrows,runtimemcs)
values
(
  1,@curnumrows,datediff(ms,@dt,getdate())
);

--'identity'
truncate  table dbo.SalesBMIdentity;
dbcc freeproccache with No_INFOMSGS;

dbcc DROPCLEANBUFFERS WITH NO_INFOMSGS;
set @dt=getdate();
insert into dbo.SalesBMIdentity(empid,qty)
select empid,qty  from dbo.salesBM  order by qty,empid;

select empid,qty,rn  from dbo.SalesBMIdentity;
insert into dbo.RNBenchmark(tid,numrows,runtimemcs)
values(2,@curnumrows,datediff(ms,@dt,getdate()));
--cursor
truncate table  dbo.SalesBMCursor;
dbcc freeproccache with No_INFOMSGS;
dbcc DROPCLEANBUFFERS WITH NO_INFOMSGS;
set @dt=getdate();
declare @empid as int,@qty  as int,@rn  as int;
begin tran
declare rncursor  cursor FAST_FORWARD
for
select empid,qty  from dbo.salesBM order by qty,empid;
open rncursor;
set @rn=0;
fetch next from rncursor into  @empid,@qty;
while @@fetch_status=0
begin
set @rn=@rn+1;
insert into dbo.SalesBMCursor(empid,qty,rn)
values
(
  @empid,@qty,@rn
);
fetch next from rncursor into  @empid,@qty;
end
close rncursor;
deallocate rncursor;--delete rncursor;
commit  tran;

select emPid,qty,rn  from dbo.SalesBMCursor;

insert into  dbo.RNBenchmark(tid,numrows,runtimemcs)
values
(3,@curnumrows,datediff(ms,@dt,getdate()));

--row_number
dbcc freeproccache with No_INFOMSGS;
dbcc DROPCLEANBUFFERS WITH NO_INFOMSGS;

set @dt=getdate();
select empid,qty, row_number() over(order by qty,empid)as rn
from dbo.SalesBM;

insert into dbo.RNBenchmark(tid,numrows,runtimemcs)
values (4,@curnumrows,datediff(ms,@dt,getdate()));
set @curnumrows=@curnumrows+@steprows;
end

--pivot table
SELECT  numrows,
[Subquery],[Cursor],[Identity],[Row_Number]
from
(
  select technique,numrows,runtimemcs
  from dbo.RNBenchmark as b
   join dbo.RNTechniques  as t
    on b.tid=t.tid
) as d
pivot(max(runtimemcs) for technique
in([subquery],[identity],[cursor],[row_number])

)  as p
order by numrows,[Subquery],[Cursor],[Identity],[Row_Number];

 

1
0
分享到:
评论

相关推荐

    各数据库分页语法支持

    Oracle 支持多种分页方式,包括三层嵌套分页、ROW_NUMBER() 函数分页及 ROWNUM 控制最大条数的方法。 1. **三层嵌套分页**: ```sql SELECT * FROM ( SELECT row_.*, ROWNUM as rownum FROM ( SELECT sid ...

    数据库分页方法

    通过对上述几种分页方法的学习,我们可以看到不同场景下应选择不同的策略来实现高效的分页功能。在实际开发过程中,根据具体需求合理选择并灵活运用这些方法,对于提升系统的整体性能和用户体验都具有重要意义。希望...

    几种数据库常见分页sql

    本文将详细介绍在SQL Server、Oracle以及MySQL这三种常用数据库中实现分页查询的方法。 ### SQL Server 分页查询 #### 方法一:使用 `TOP` 关键字 SQL Server 提供了 `TOP` 关键字来进行分页查询。这种方式比较...

    几种数据库的数据分页

    ### 几种数据库的数据分页 #### 概述 数据分页是指在处理大量数据时,将数据分成多个页面进行展示的技术。对于大型数据库系统来说,分页不仅可以提高查询效率,还能改善用户体验。本文将详细介绍MySQL、SQL Server...

    Java Servlet 数据库分页功能演示.rar

    在Servlet中实现数据库分页,主要涉及以下几个步骤: 1. **连接数据库**:使用JDBC(Java Database Connectivity)API建立与数据库的连接。这通常包括加载驱动、建立连接、创建Statement或PreparedStatement对象。 ...

    java web利用数据库分页

    在Java Web开发中,数据库分页是一种常见的技术,用于处理大量数据时提高应用程序的性能和用户体验。当数据集过大,一次性加载所有记录到用户界面可能导致内存压力和响应速度下降。因此,分页允许用户逐步浏览数据,...

    C#后台分页及数据库脚本常用的几种分页写法

    ### C#后台分页及数据库脚本常用的几种分页写法 #### 分页技术概述 在Web开发中,为了提高用户体验以及服务器性能,通常会采用分页技术来展示大量数据。分页技术不仅可以减少单次请求的数据量,降低服务器压力,还...

    数据库分页

    本篇文章将深入探讨数据库分页的基本原理、常见方法以及在不同数据库系统中的实现。 首先,理解分页的基本概念。分页是将数据库中的结果集分割成多个部分,每个部分称为一页,用户每次请求时只返回一页的数据。这在...

    Oracle,mysql,sqlserver等各种数据库的分页方法

    ### 数据库分页方法概述 在数据库操作中,分页是一项非常重要的技术,尤其是在处理大量数据时,能够有效地提升查询效率和用户体验。本文将详细介绍Oracle、MySQL、SQL Server等常见数据库系统的分页方法。 ### ...

    Oracle数据库分页的集中方法(三种方法)

    以下将详细介绍Oracle数据库中三种常见的分页查询方法。 1. **基于ROWNUM的简单分页** ROWNUM是Oracle数据库中的一个伪列,它表示行的顺序号。在查询时,ROWNUM会从1开始递增。然而,需要注意的是,ROWNUM不能直接...

    oracle、mysql数据库分页

    ### Oracle与MySQL数据库分页实现方案详解 #### 一、Oracle数据库分页 在Oracle数据库中,实现分页查询可以通过多种方法,其中一种常见的方法是使用`ROWNUM`伪列来实现。 **基本原理:** - `ROWNUM`用于标识查询...

    sql分页查询几种写法

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

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

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

    mysql_海量数据库的查询优化及分页算法方案.doc

    MySQL 海量数据库的查询优化及分页算法方案 在大规模数据库中,查询优化和分页算法是两个非常重要的方面。本文将详细介绍 MySQL 海量数据库的查询优化和分页算法方案。 一、查询优化 查询优化是指通过调整查询...

    sql分页的几种方法

    ### SQL分页的几种方法 #### 背景介绍 在数据库操作中,分页是一项非常常见的需求。尤其是在处理大量数据时,为了提高查询效率、减少服务器负担,并为用户提供更好的体验,分页变得尤为重要。SQL提供了多种实现分页...

    海量数据库的查询优化及分页算法方案

    3. **RowNum/Rank分页**:在SQL中使用ROW_NUMBER()函数,为每行数据分配一个唯一的行号,然后根据行号进行分页,但这种方法在大数据集上可能效率较低。 4. **InnoDB的ROWID分页**:InnoDB存储引擎的聚簇索引提供了...

    各种数据库分页查询方法

    数据库分页查询是数据检索中的常见操作,尤其在大数据量的场景下,为了提高用户体验,分页能够有效地减少数据加载时间并避免一次性加载过多数据导致的性能问题。下面将详细介绍几种常见数据库系统的分页查询方法。 ...

    海量数据库查询优化及分页算法方案

    1. **RowNumber分页**:SQL Server支持`ROW_NUMBER()`函数,通过为结果集中的每一行分配一个唯一的行号,然后根据需要的页码和每页大小来选择特定范围的行。 2. **Limit分页**:在MySQL中,可以使用`LIMIT`关键字...

Global site tag (gtag.js) - Google Analytics