有关stackoverflow的许多sql服务器分页问题,其中许多谈论使用ROW_NUMBER() OVER (ORDER BY ...) AND CTE
。一旦进入成千上万的行并开始添加对非主键值的排序并添加自定义WHERE子句,这些方法将变得非常无用。我有一个数百万行的数据集,我试图通过自定义排序和筛选来进行分页,但是即使在所有依我排序和筛选的字段上都有索引,我的性能也很差。我什至甚至将我的SELECT列包括在每个索引中,但是这几乎没有帮助并且严重severe肿了我的数据库。
我注意到无论您单击什么排序标准或页码,stackoverflow分页仅花费大约500毫秒。有谁知道如何使分页在SQL Server 2008中有效地进行分页处理?这将包括尽可能高效地获取总行数。
我当前的查询具有与有关页面调度的stackoverflow问题完全相同的逻辑:
Best paging solution using SQL Server 2005?
最佳答案
有谁知道如何使分页在SQL Server 2008中有效地进行分页处理?
如果您想要准确的完美分页,则无可替代的是为每个记录构建索引键(位置行号)。但是,还有其他选择。
(1)总页数(记录数)
如果变化率很小,则可以使用sysindexes.rows
的近似值(几乎是瞬间)。
您可以使用触发器来保持完全准确,到第二个表行计数
(2)分页
(一个)
您可以在接下来的五页内显示到记录两边的页面跳转。它们每面最多需要扫描{页面大小} x 5。如果您的基础查询很适合快速沿排序顺序运行,那么这应该不会很慢。因此,给定一条记录X,您可以使用转到上一页(假设排序顺序为a asc, b desc
select top(@pagesize) t.*
from tbl x
inner join tbl t on (t.a = x.a and t.b > x.b) OR
(t.a < a.x)
where x.id = @X
order by t.a asc, t.b desc
(即X之前的记录的最后{页面大小})
要返回五页,请将其增加到TOP(@ pagesize * 5),然后再从该子查询中增加TOP(@pagesize)。
缺点:此选项要求您不能直接跳转到特定位置,只能选择第一(容易),最后(容易),下一页/优先,每页
(b)
如果分页总是非常明确和可预测的,请维护索引视图或触发器更新的表,该表的行号中不包含空格。如果这些表通常仅在频谱的一端看到更新,而删除的空白很容易通过移动不太多的记录来快速填充,则这可能是一种选择。
这种方法为您提供了行数(最后一行),并且还可以直接访问任何页面。
关于sql-server - Microsoft SQL Server分页,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5335797/