我在SQL Server 2012提供的旧row_number(SQL Server 2008)和较新的OFFSET + FETCH(SQL Server 2012)分页机制的上下文中几乎没有问题。
感谢。
答案 0 :(得分:18)
使用ROW_NUMBER()
可以正常工作 - 这只是必要的工作量;您需要围绕实际查询编写“骨架”CTE,将ROW_NUMBER()
列添加到输出集,然后对其进行过滤。
使用新的OFFSET / FETCH
更简单 - 是的,它的性能也更好,因为这两个链接可以显示:
总的来说:如果你使用 SQL Server 2012 - 那么你应该肯定使用OFFSET/FETCH
而不是ROW_NUMBER()
进行分页
答案 1 :(得分:2)
根据定义,ROW_NUMBER
是查询运行时计算的临时值。 OFFSET / FETCH
是您可以为 ORDER BY
子句指定的选项。
就速度而言,它们都实现了出色的性能,每种方法之间的差异取决于您在 SELECT
子句中指定的列以及您在表中拥有的索引。
在以下 2 个示例中,您可以看到两种方法之间的区别:
1. OFFSET / FETCH 更快的情况:
SELECT
Id
FROM Orders
ORDER BY
Id
OFFSET 50000 ROWS FETCH NEXT 5000 ROWS ONLY
SELECT
A.Id
FROM
(
SELECT
Id,
ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Orders
) AS A
WHERE
A.RowNumber BETWEEN 50001 AND 55000
2. ROW_NUMBER() 更快的情况:
SELECT
*
FROM Orders
ORDER BY
Id
OFFSET 50000 ROWS FETCH NEXT 5000 ROWS ONLY
SELECT
A.*
FROM
(
SELECT
*,
ROW_NUMBER() OVER (ORDER BY Id) AS RowNumber FROM Orders
) AS A
WHERE
A.RowNumber BETWEEN 50001 AND 55000
答案 2 :(得分:1)