如何在分页结果视图中获得总结果数?

时间:2009-11-28 09:35:02

标签: sql count paging

我有一个大约有DB表。 100,000个条目。

我的网络应用会显示搜索查询的分页结果,可能会产生0到100,000条记录。

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

  • 显示结果总数
  • 显示分页视图,每页50-100个结果。

显然我想从DB一次只查询一个页面的记录,但这是一个两难的问题 - 如何在不运行整个查询的情况下获取COUNT()?

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

如果我们在每个结果集100 krecords的范围内,你通常在这种情况下做什么?

基本上, 能够同时显示“找到xxxxx结果”消息和结果分成页面的最有效方法是什么?

3 个答案:

答案 0 :(得分:1)

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

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

相当多的分页相关posts in SO here

答案 1 :(得分:1)

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

所以它很贵,但值得吗?事实证明,总页数是一个没人使用的功能。因此,不要在这方面花费大量时间进行跟踪。这不值得。

不要显示总页数。

答案 2 :(得分:0)

这就是我之前在这些方面取得成就的方式。性能远远不是很好,但是在特定的上下文中使用它并不重要(即使假设最坏的情况,也不到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