相比在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 Server 2005 中,使用 ROW_NUMBER() 函数可以实现分页功能,这种方法相比于 SQL Server 2000 中的分页方式效率要高出很多。但是,很多人在使用 ROW_NUMBER() 函数时,使用的方法并不正确。 在本文中,我们将...
SQL Server 2005 及其后续版本引入了 `ROW_NUMBER()` 函数,使得实现分页功能变得更加简单高效。本文将详细介绍一个基于 SQL Server 2005 的分页存储过程,该存储过程不仅支持多表分页查询,还能进行分组查询。 ###...
在SQL Server 2005及以后的版本中,`Row_number()` 成为了实现数据分页的标准方法,因为它既简单又高效。 `Row_number()` 函数的基本语法如下: ```sql ROW_NUMBER() OVER (ORDER BY ordering_column) ``` 在这个...
在SQL Server 2005中,`ROW_NUMBER()`函数是一个非常重要的窗口函数,它在数据处理和查询优化方面发挥着关键作用,特别是在实现存储过程中的分页功能时。本文将深入探讨`ROW_NUMBER()`函数的工作原理,以及如何在...
本篇将详细探讨两种不同的分页实现方式,一种是使用ROW_NUMBER()函数,另一种是不使用ROW_NUMBER()函数,并分析它们的性能差异。 首先,ROW_NUMBER()函数在SQL Server中被广泛用于生成行号,常用于分页查询。它为每...
在SQL语言中,`ROW_NUMBER()`函数是一种非常重要的窗口函数,用于为查询结果集中的每一行分配一个唯一的整数。这个数字通常按照行的出现顺序进行分配,但也可以根据特定的排序条件进行调整。`ROW_NUMBER()`在数据...
ROW_NUMBER() 函数是 SQL Server 2005 中的新功能,它可以实现数据的分页功能,从而提高数据查询的效率。在本文中,我们将详细介绍 ROW_NUMBER() 函数的使用方法和优点,以及如何使用它来实现高效的数据分页。 ROW_...
综上所述,尽管`TOP`和子查询的方法在SQL Server早期版本中被广泛使用,但在SQL Server 2005及更高版本中,推荐使用`ROW_NUMBER()`窗口函数来进行分页查询,以获得更好的性能和资源利用。不过,具体选择哪种方法还...
总结来说,SQL Server 2005中的四个排名函数各有特点: - `row_number`:为每一行生成一个唯一的序号,不受相同值的影响。 - `rank`:在考虑相同值的情况下分配序号,出现相同值时跳过序号。 - `dense_rank`:同样...
需要注意的是,`ROW_NUMBER()` 在当前`SELECT`语句中是不可见的,即不能直接在外部查询中使用`RowNumber`进行排序。此外,这种方式比传统的`TOP`和`NOT IN`方法更有效率,因为它避免了多次扫描表。 在SQL Server ...
采用另外一种方式来进行分页。。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()`是一种强大的工具,用于在查询结果集中为每一行分配一个唯一的序列号。这个函数通常用于数据分页、排名或者为特定条件的记录分配顺序。下面我们将详细讨论`ROW_NUMBER() OVER...
设置sqlServer使用ROW_NUMBER时不排序 –1.看到NHibernate是这样写的分页,感觉写起来比较容易理解(应该不会有效率问题吧?) –with只是定一个别名? [sql] with query as (select ROW_NUMBER() over(order by ...
ROW_NUMBER() OVER 函数是 SQL Server 中的一个窗口函数,用于对查询结果进行编号。该函数可以根据指定的列进行分组和排序,并为每一组记录返回一个唯一的编号。 语法: ROW_NUMBER() OVER (PARTITION BY COLUMN ...
在SQL Server 2005中,分页查询是一个常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要一次性加载一定数量的数据,而不是一次性显示所有数据。以下将详细讲解SQL Server 2005中分页查询的常用方法。...
总结来说,SQL Server 2005中的ROW_NUMBER() OVER函数是实现分页查询的强大工具,它允许我们在保持高效性能的同时,轻松地对数据进行分组和排序,进而实现灵活的分页功能。通过理解并熟练掌握这个函数,开发者可以更...
ROW_NUMBER() 函数是 SQL Server 2005 引入的一个重要特性,它使得数据库开发者能够在不支持 LIMIT 关键字的 SQL Server 中实现类似 MySQL 的分页效果。该函数可以为结果集中的每一行分配一个唯一的整数,从而允许...
在SQL Server 2005中,`row_number()` 是一个非常有用的内置函数,它能够为查询结果集中的每一行分配一个唯一的整数。通常,我们利用`row_number()`进行数据分页,但这里我们将讨论如何利用这个函数来删除表中的重复...
- 而在 SQL Server 中,如果需要按特定顺序为行分配行号,则必须使用 ORDER BY 与 ROW_NUMBER() 结合的方式。 3. **分页查询的实现方式:** - 在 Oracle 中,通常使用以下方式实现分页查询: ```sql SELECT * ...