我有一个大约有DB表。 100,000个条目。
我的网络应用会显示搜索查询的分页结果,可能会产生0到100,000条记录。
生成输出时,我想做两件事:
显然我想从DB一次只查询一个页面的记录,但这是一个两难的问题 - 如何在不运行整个查询的情况下获取COUNT()?
如果我必须运行整个查询,那么选择它并缓存在内存中是不是更好?
如果我们在每个结果集100 krecords的范围内,你通常在这种情况下做什么?
基本上, 能够同时显示“找到xxxxx结果”消息和结果分成页面的最有效方法是什么?
答案 0 :(得分:1)
答案 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