如果还想获得结果总数(在分页之前),在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应用程序,那就是除了要返回的行号之外,你不需要保留任何状态.

Sql相关问答推荐

基于时间的SQL聚合

GROUP BY和GROUP_CONCAT用于计算比赛排名

用于平均多个数据并与一个数据点进行比较以判断偏移量的SQL查询

SQL(PostgreSQL)从条件创建点表

SQL—如何根据2列填写缺失的值

如何在SQL Server中拆分包含字符和数字的列?

如何计算一个用户S的日常连胜?

基于另一个(SAS、SQL)中的值更新列

嵌套Json对象的SQL UPDATE WHERE

从给定数据中查找下一个工作日期

按行值出现的顺序对行值进行分组

AdventureWorks 查询

具有分组条件的不同计数 (DAX)

SQL 根据前一天的最大值计算每天的值数

特殊条件计算小计

SQL 中的第一个值和倒数第二个值

将一名成员金额分配给群组内的其他成员

如何在sparksql查询中使用日期值?

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

有条件求和