Microsoft SQL Server分页

jjx*_*tra 5 sql-server pagination

stackoverflow上有许多sql server分页问题,​​其中很多都在谈论使用ROW_NUMBER() OVER (ORDER BY ...) AND CTE.一旦进入数十万行并开始在非主键值上添加排序并添加自定义WHERE子句,这些方法就变得非常有用了.我有一个数百万行的数据集,我试图通过自定义排序和过滤进行翻页,但是我的性能很差,即使在我排序和过滤的所有字段上都有索引.我甚至在每个索引中包含了我的SELECT列,但这对我的数据库几乎没有帮助和严重膨胀.

我注意到无论您点击什么排序标准或页码,stackoverflow分页只需要大约500毫秒.任何人都知道如何在具有数百万行的SQL Server 2008中有效地进行分页工作?这将包括尽可能有效地获得总行数.

我当前的查询与此有关分页的stackoverflow问题具有完全相同的逻辑: 使用SQL Server 2005的最佳分页解决方案?

Ric*_*iwi 5

任何人都知道如何在具有数百万行的SQL Server 2008中有效地进行分页工作?

如果您想要准确完美的分页,则无法替代为每条记录构建索引键(位置行号).但是,还有其他选择.

(1)总页数(记录)

  • sysindexes.rows假设变化率很小,您可以使用(几乎是即时的)近似值.
  • 您可以使用触发器来维护完全准确的第二行表计数

(2)分页

(a)
您可以在记录的任何一侧显示页面跳转,例如接下来的五页.这些需要在每侧扫描最多{页面大小} 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
Run Code Online (Sandbox Code Playgroud)

(即X之前的记录的最后{页面大小})

要返回五页,将其增加到TOP(@ pagesize*5),然后从该子查询中进一步增加TOP(@pagesize).

缺点:此选项要求您不能直接跳转到特定位置,您的选项只有FIRST(简单),LAST(简单),NEXT/PRIOR,<5页左右

(b)
如果分页总是非常具体和可预测,则维护一个INDEXED视图或触发更新的表,该表不包含行号中的间隙.如果表通常只能看到频谱一端的更新,那么这可能是一种选择,通过移动不那么多的记录可以很容易地快速填充删除的间隙.

此方法为您提供行数(最后一行),并且还可以直接访问任何页面.