65.9K
CodeProject 正在变化。 阅读更多。
Home

SQL SERVER - 2005 T-SQL 分页查询技术比较 (OVER 和 ROW_NUMBER()) - CTE 与派生表

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.80/5 (6投票s)

2007年6月17日

viewsIcon

32980

SQL SERVER - 2005 T-SQL 分页查询技术比较 (OVER 和 ROW_NUMBER()) - CTE 与派生表

引言

我收到了一些关于我文章 SQL SERVER - T-SQL 分页查询技术比较 - SQL 2000 vs SQL 2005 的邮件和评论。主要问题是是否可以使用 CTE 实现? 当然可以! 性能如何? 性能相同! 请参考上述文章了解分页的历史。

SQL Server 2005 代码示例

SQL 2005 Paging Method Using Derived Table

USE AdventureWorks
GO
DECLARE @StartRow INT
DECLARE @EndRow INT
SET @StartRow = 120
SET @EndRow = 140
SELECT FirstName, LastName, EmailAddress
FROM (
SELECT PC.FirstName, PC.LastName, PC.EmailAddress,
ROW_NUMBER() OVER(Order BY PC.FirstName, PC.LastName,PC.ContactID) AS RowNumber
FROM Person.Contact PC) PersonContact
WHERE RowNumber > @StartRow AND RowNumber < @EndRow
ORDER BY FirstName, LastName, EmailAddress
GO

SQL 2005 Paging Method Using CTE

USE AdventureWorks
GO
DECLARE @StartRow INT
DECLARE @EndRow INT
SET @StartRow = 120;
SET @EndRow = 140;

WITH PersonContact AS
(
SELECT PC.FirstName, PC.LastName, PC.EmailAddress,
ROW_NUMBER() OVER(Order BY PC.FirstName, PC.LastName,PC.ContactID) AS RowNumber
FROM Person.Contact PC)

SELECT FirstName, LastName, EmailAddress
FROM PersonContact
WHERE RowNumber > @StartRow AND RowNumber < @EndRow
ORDER BY FirstName, LastName, EmailAddress
GO   

以下执行计划图像显示,在同一批次中,两者的性能是相同的。但这在存在复杂查询时可能不成立。大多数情况下,它们会是相同的。

Screenshot - SQL_CTEDerivedTable.gif

关注点

请在此处参考原始文章

SQL SERVER - 2005 T-SQL 分页查询技术比较 (OVER 和 ROW_NUMBER()) - CTE 与派生表

参考

Pinal Dave (http://www.SQLAuthority.com), SQL SERVER - T-SQL 分页查询技术比较 - SQL 2000 vs SQL 2005
© . All rights reserved.