快速变化的数据库内容的分页

时间:2012-02-22 12:24:55

标签: sql sql-server database pagination

我需要使用分页来读取MS SQL数据库表的内容,即获取N行的第一页,然后是N行的第二页,依此类推。

如果在分页期间数据库的内容发生了显着变化,则会出现一个简单的分页查询,如:

SELECT *
FROM (SELECT a.*,
    ROW_NUMBER() OVER (ORDER BY id) AS rnum
    FROM articles a)
WHERE rnum <= 10
AND   rnum >= 6;

可能无法可靠地运作。可以跳过插入的行,或者可以导致后续行重复,删除的行可能导致后续行被跳过。

我可以通过执行以下任何操作来避免此类问题:

  1. 在整个分页期间锁定行以更新 - 限制性的
  2. 在分页前将行复制到临时表 - 太慢
  3. 通过行号和排序值的组合进行选择 显示在上一页的末尾,在a恢复 基于变化表的适当位置,但仍然得到 只有接下来的N行
  4. 我有点像第三种解决方案,但是当排序列中存在重复值时,我发现很难实现。

    例如,假设我有一个按降序排序的文章列表。如果评级相同,则按升序ID排序(ID是唯一的):

    ID      RATING
    9       34
    3       32
    6       32
    8       32
    12      32
    1       25
    2       23
    

    现在,我想要3篇文章的页面,这意味着第一页将有第9,3和6条。这是通过查询排序列表中的前3篇文章来完成的。

    现在,我想从第8条继续接下来的3篇文章,使用文章ID作为恢复位置的标记。

    如果我告诉数据库采取第8条的声誉,而不是采取声誉低于此的3篇文章,我会跳过第12条。

    如果我告诉数据库取得第8条的声誉,而不是取3声名称低于或等于的声明,我会重复第3条和第6条。

    我可以使用哪种SQL查询(或查询组合)来恢复第8条的分页,使用文章ID作为恢复位置的标记?

1 个答案:

答案 0 :(得分:3)

将评论转换为答案,因为它似乎解决了用户的问题。

因此,您似乎应该为该用户缓存结果(例如,您是否可以将所有ID发送到应用程序并让它在每次获取时一次只提取3篇文章),但也添加免责声明,如果需要他们半小时滚动列表,列表可能不再准确。