`
hybxiaodao
  • 浏览: 247154 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

使用SQL Server 2005 新的语法ROW_NUMBER()进行分页的两种不同方式的性能比较

 
阅读更多

 

相比在SQL Server 2000  中使用的分页方式,在 SQL Server 2005 中使用新的语法 ROW_NUMBER() 来分页效率要高出很多,但是很多人在使用 ROW_NUMBER() 这种分页方式时,使用的方法并不正确,以下列出不正确的和正确的做法并做简单分析:

首先假设我们已经创建了如下的表和索引并初始化了100 万条数据:

CREATE TABLE [dbo].[Users]
(
  [ID] [int] IDENTITY(1,1) NOT NULL,
  [Name] [varchar](50) NULL,
  [test] [nchar](10) NULL,
  CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
  (
      [ID] ASC
  ) ON [PRIMARY]
) ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [Inx_Name] ON [dbo].[Users] 
(
  [Name] ASC
) ON [PRIMARY]

DECLARE @index INT
SET @index=0
WHILE @index<1000000 
BEGIN
        INSERT INTO Users(Name,test) values(@index,'walkingp') 
  SET @index = @index + 1
END 

不正确的使用方式( 查出所有数据后再排序 )

select Id,Name,test from (select row_number() over(order by name) as rowNum,* from users) as t where rowNum between 5000 and 5100 

正确的使用方式如下( 查出主键进行排序过滤,然后使用过滤后的主键来查找数据 )

select a.Id,a.Name,a.test  from users as a inner join (select rowNum,id from (select row_number() over(order by name) as rowNum,ID from users) as t where rowNum between 4000 and 4100) as b on a.id = b.id order by b.rownum

 

 

 错误的使用方式逻辑读要比正确的使用方式的逻辑读大的多,而且页码越大读的越多,最终导致效率越来越差,这点也可以通过执行计划看出端倪。

以下是执行计划:

  通过对比执行计划我们发现错误的使用方式在一开始就要读取聚集索引的数据分页中的数据,而正确的使用方式在一开始只是读取Inx_Name 所引的所有数据分析,这在最后查出 101 条数据后才从聚集索引的数据分页中查找数据,因此效率要高的多,这种方式应该是创建此类 SQL 的一个通用原则。

 

分享到:
评论

相关推荐

    SQL ROW_NUMBER()分页比较

    在 SQL Server 2005 中,使用 ROW_NUMBER() 函数可以实现分页功能,这种方法相比于 SQL Server 2000 中的分页方式效率要高出很多。但是,很多人在使用 ROW_NUMBER() 函数时,使用的方法并不正确。 在本文中,我们将...

    分页存储过程,仅适用于Sql2005以上,使用 ROW_NUMBER()函数用于多表分页查询,可以分组查询

    SQL Server 2005 及其后续版本引入了 `ROW_NUMBER()` 函数,使得实现分页功能变得更加简单高效。本文将详细介绍一个基于 SQL Server 2005 的分页存储过程,该存储过程不仅支持多表分页查询,还能进行分组查询。 ###...

    Row_number 分页存储过程

    在SQL Server 2005及以后的版本中,`Row_number()` 成为了实现数据分页的标准方法,因为它既简单又高效。 `Row_number()` 函数的基本语法如下: ```sql ROW_NUMBER() OVER (ORDER BY ordering_column) ``` 在这个...

    SQL Server 2005中ROW_NUMBER()函数在存储过程分页中的应用.pdf

    在SQL Server 2005中,`ROW_NUMBER()`函数是一个非常重要的窗口函数,它在数据处理和查询优化方面发挥着关键作用,特别是在实现存储过程中的分页功能时。本文将深入探讨`ROW_NUMBER()`函数的工作原理,以及如何在...

    sqlserver 通用存储过程分页代码(附使用ROW_NUMBER()和不使用ROW_NUMBER()两种情况性能分析)

    本篇将详细探讨两种不同的分页实现方式,一种是使用ROW_NUMBER()函数,另一种是不使用ROW_NUMBER()函数,并分析它们的性能差异。 首先,ROW_NUMBER()函数在SQL Server中被广泛用于生成行号,常用于分页查询。它为每...

    row_number.rar_SQL中row_number用法_number

    在SQL语言中,`ROW_NUMBER()`函数是一种非常重要的窗口函数,用于为查询结果集中的每一行分配一个唯一的整数。这个数字通常按照行的出现顺序进行分配,但也可以根据特定的排序条件进行调整。`ROW_NUMBER()`在数据...

    ROW_NUMBER()函数

    ROW_NUMBER() 函数是 SQL Server 2005 中的新功能,它可以实现数据的分页功能,从而提高数据查询的效率。在本文中,我们将详细介绍 ROW_NUMBER() 函数的使用方法和优点,以及如何使用它来实现高效的数据分页。 ROW_...

    SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同

    综上所述,尽管`TOP`和子查询的方法在SQL Server早期版本中被广泛使用,但在SQL Server 2005及更高版本中,推荐使用`ROW_NUMBER()`窗口函数来进行分页查询,以获得更好的性能和资源利用。不过,具体选择哪种方法还...

    SQL2005 四个排名函数(row_number、rank、dense_rank和ntile)的比较

    总结来说,SQL Server 2005中的四个排名函数各有特点: - `row_number`:为每一行生成一个唯一的序号,不受相同值的影响。 - `rank`:在考虑相同值的情况下分配序号,出现相同值时跳过序号。 - `dense_rank`:同样...

    sqlserver2005使用row_number() over分页的实现方法

    需要注意的是,`ROW_NUMBER()` 在当前`SELECT`语句中是不可见的,即不能直接在外部查询中使用`RowNumber`进行排序。此外,这种方式比传统的`TOP`和`NOT IN`方法更有效率,因为它避免了多次扫描表。 在SQL Server ...

    Row_Number() Sql分页

    采用另外一种方式来进行分页。。RowNumber方式或许更快,方式更好点

    各数据库分页语法支持

    DB2 支持两种分页方法:使用 ROW_NUMBER() 函数和 FETCH FIRST ROWS ONLY 语法。 1. **ROW_NUMBER() 函数分页**: ```sql SELECT * FROM ( SELECT sid, ROW_NUMBER() OVER (ORDER BY sid) AS ROWNUM FROM test...

    oracle分析函数row_number() over()使用

    Oracle的分析函数`ROW_NUMBER() OVER()`是一种强大的工具,用于在查询结果集中为每一行分配一个唯一的序列号。这个函数通常用于数据分页、排名或者为特定条件的记录分配顺序。下面我们将详细讨论`ROW_NUMBER() OVER...

    sqlServer使用ROW_NUMBER时不排序的解决方法

    设置sqlServer使用ROW_NUMBER时不排序 –1.看到NHibernate是这样写的分页,感觉写起来比较容易理解(应该不会有效率问题吧?) –with只是定一个别名? [sql] with query as (select ROW_NUMBER() over(order by ...

    ROW_NUMBER() OVER函数的基本用法

    ROW_NUMBER() OVER 函数是 SQL Server 中的一个窗口函数,用于对查询结果进行编号。该函数可以根据指定的列进行分组和排序,并为每一组记录返回一个唯一的编号。 语法: ROW_NUMBER() OVER (PARTITION BY COLUMN ...

    SQL Server2005分页查询

    在SQL Server 2005中,分页查询是一个常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要一次性加载一定数量的数据,而不是一次性显示所有数据。以下将详细讲解SQL Server 2005中分页查询的常用方法。...

    SQL2005利用ROW_NUMBER() OVER实现分页功能

    总结来说,SQL Server 2005中的ROW_NUMBER() OVER函数是实现分页查询的强大工具,它允许我们在保持高效性能的同时,轻松地对数据进行分组和排序,进而实现灵活的分页功能。通过理解并熟练掌握这个函数,开发者可以更...

    ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

    ROW_NUMBER() 函数是 SQL Server 2005 引入的一个重要特性,它使得数据库开发者能够在不支持 LIMIT 关键字的 SQL Server 中实现类似 MySQL 的分页效果。该函数可以为结果集中的每一行分配一个唯一的整数,从而允许...

    SqlServer2005中使用row_number()在一个查询中删除重复记录的方法

    在SQL Server 2005中,`row_number()` 是一个非常有用的内置函数,它能够为查询结果集中的每一行分配一个唯一的整数。通常,我们利用`row_number()`进行数据分页,但这里我们将讨论如何利用这个函数来删除表中的重复...

    oracle rownum 的使用 和sqlserver有区别的!

    - 而在 SQL Server 中,如果需要按特定顺序为行分配行号,则必须使用 ORDER BY 与 ROW_NUMBER() 结合的方式。 3. **分页查询的实现方式:** - 在 Oracle 中,通常使用以下方式实现分页查询: ```sql SELECT * ...

Global site tag (gtag.js) - Google Analytics