如果您还想获得结果的总数(在分页之前),那么在 SQL Server 2000、2005、2008、2012 中对结果进行分页的最佳方法(性能方面)是什么?
获取结果总数和分页是两个不同的操作。为了这个例子,让我们假设您正在处理的查询是
SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate
在这种情况下,您将使用以下方法确定结果总数:
SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'
…这可能看起来效率低下,但实际上性能相当不错,假设所有索引等都已正确设置。
接下来,要以分页方式返回实际结果,以下查询将是最有效的:
SELECT * FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, * FROM Orders WHERE OrderDate >= '1980-01-01' ) AS RowConstrainedResult WHERE RowNum >= 1 AND RowNum < 20 ORDER BY RowNum
这将返回原始查询的第 1-19 行。这里很酷的事情,尤其是对于网络应用程序,是您不必保留任何状态,除了要返回的行号。