使用Top和Count的最佳方法- SQL Server 2008

本文关键字:SQL Server 2008 方法 最佳 Top Count 使用 | 更新日期: 2023-09-27 18:01:23

我有一个2008年c#应用程序(后端SQL Server 2008),有时查询返回大量结果。因此,我研究了一些分页算法,并使用了TOP语句。我喜欢这样一个事实,如果我有500个结果,每页只显示20个结果,我只能查询数据库中的20条记录,而不是将所有500条记录存储在内存中。

我的问题是,为了实现分页算法,我需要知道这个查询中有多少条记录。因此,我所做的是运行另一个具有相同参数的查询,只是选择ID(而不是整个对象),以尝试使其快速运行。由于某些原因,我认为运行这两个查询(从而建立2个连接)并不是最好的方法。

所以我需要所有记录的计数,但只想选择在TOP中使用的有限数量。这里需要临时桌子吗?我现在有两个不同的存储过程。

感谢大家提供的"最佳实践"建议。

使用Top和Count的最佳方法- SQL Server 2008

您可以使用对象数据源…要实现这个自定义分页

我将使用ROW_NUMBER() OVER (ORDER BY ...)

我不知道你们用什么方法进行分页但是我通常使用的技术是使用ROW_NUMBER函数,例如:

SELECT  Description, Date
FROM
(
    SELECT  ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row,
        Description, Date 
    FROM Log
) AS LogWithRowNumbers
WHERE  Row >= 1 AND Row <= 10

这是我所知道的最干净的方法,可以处理任何子查询,只需要一个查询。

当然,如果你想在你的页面上显示"总点击数"或类似的,那么你还需要另一个查询来获得行数:

SELECT COUNT(*) FROM Log

但是,您可以在同一个批处理中执行这两个语句,以防止需要额外的"往返"到数据库服务器。

Source - Paging Records Using SQL Server 2005 Database - ROW_NUMBER Function

如果在存储过程中执行两个选择,则在使用Fill方法后,数据集中将得到两个数据表。

我会尝试这样做:

;WITH CTE AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row,
        COUNT(*) OVER() AS TotalCount,
        Description, Date 
    FROM Log
)
SELECT *
FROM CTE
WHERE Row BETWEEN 1 AND 10

这将提供分页和1个查询中的计数。还可以使用CASE语句只在特定时间进行计数。例如,当用户分页时计数是否会改变?