如果您还希望获得结果总数(在进行分页之前),那么在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行。这里最酷的事情是,尤其是对于Web应用程序,您无需保留任何状态,除了要返回的行号。