Sql 如何在分页结果视图中获取总结果计数?

Sql 如何在分页结果视图中获取总结果计数?,sql,count,paging,Sql,Count,Paging,我有一个DB表,大约有100000个条目 我的web应用程序将显示分页的搜索查询结果,可能产生0到100000条记录 生成输出时,我想做两件事: 显示结果的总数量 显示分页视图,每页显示50-100个结果 显然,我想从DB一次只查询一页记录,但这里有一个难题-如何在不运行整个查询的情况下获取COUNT() 如果我必须运行整个查询,那么选择所有查询并在内存中缓存不是更好吗 在这种情况下,如果每个结果集的记录数在100克以内,您通常会怎么做 基本上, 显示“found xxxxx results

我有一个DB表,大约有100000个条目

我的web应用程序将显示分页的搜索查询结果,可能产生0到100000条记录

生成输出时,我想做两件事:

  • 显示结果的总数量
  • 显示分页视图,每页显示50-100个结果
显然,我想从DB一次只查询一页记录,但这里有一个难题-如何在不运行整个查询的情况下获取COUNT()

如果我必须运行整个查询,那么选择所有查询并在内存中缓存不是更好吗

在这种情况下,如果每个结果集的记录数在100克以内,您通常会怎么做

基本上,
显示“found xxxxx results”消息和拆分为页面的结果的最有效方式是什么?

您可以通过运行单独的查询,而无需检索所有其他表列,首先获取计数

根据计数值,您可以决定检索/分页策略


相当多的页面与之相关。

显示页面总数的成本很高。数据库必须完成到最后一行的查询。它必须从磁盘读取它们,执行连接,计算where子句和列计算

所以很贵,但值得吗?事实证明,总页数是一个无人使用的特性。所以不要在这件事上花太多时间。这不值得


不要显示总页数。

这就是我以前在这些方面取得成就的原因。性能远不是很好,但在使用它的特定上下文中,这并不重要(即使假设最坏的情况,也不到70k行),大多数查询都会过滤内部派生表,直到不存在问题为止

我会回应其他答案中表达的“这值得吗?”的观点

DECLARE @StartRow INT
DECLARE @EndRow INT
SET @StartRow = 10;
SET @EndRow = 30;

SELECT M.[RowID], M.[UPRN], M.[Address_1], M.RowID+RowID2 as [TotalRows]
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY A1.UPRN ASC) as RowID,
       ROW_NUMBER() OVER (ORDER BY A1.UPRN DESC) as RowID2,
       A1.UPRN, 
       A1.Add_1
          FROM Core.Addresses A1
    ) as M
    WHERE M.RowID BETWEEN @StartRow and @EndRow

今天我自己也在调查这件事。说得好。