使用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中使用的有限数量。这里需要临时桌子吗?我现在有两个不同的存储过程。
感谢大家提供的"最佳实践"建议。
您可以使用对象数据源…要实现这个自定义分页
我将使用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语句只在特定时间进行计数。例如,当用户分页时计数是否会改变?