代码之家  ›  专栏  ›  技术社区  ›  Andy

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

  •  3
  • Andy  · 技术社区  · 16 年前

    我有一个数据库表,大约有100000个条目。

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

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

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

    显然,我希望一次只从db查询一个页面的记录,但这里有一个难题-如何在不运行整个查询的情况下获取count()?

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

    在这种情况下,如果我们在每个结果集100条记录的范围内,您通常会怎么做?

    基本上, 有什么最有效的方法可以同时显示“found xxxxx results”消息和拆分成页面的结果?

    3 回复  |  直到 16 年前
        1
  •  1
  •   Andomar    16 年前

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

    所以很贵,但是值得吗?事实证明,总页数是没有人使用的功能。所以不要在这件事上浪费太多时间。这不值得。

    不显示总页数。

        2
  •  1
  •   Community Mohan Dere    9 年前

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

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

    相当多的寻呼相关 posts in SO here .

        3
  •  0
  •   dantefs    16 年前

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