3 回答
TA贡献1851条经验 获得超4个赞
尝试使用
FROM [TableX]
ORDER BY [FieldX]
OFFSET 500 ROWS
FETCH NEXT 100 ROWS ONLY
在SQL服务器中获取501到600的行,而不将它们加载到内存中。请注意,此语法仅适用于SQL Server 2012
TA贡献1834条经验 获得超8个赞
然LINQ-to-SQL将生成一个OFFSET子句(可能使用ROW_NUMBER() OVER() 其他人提到的模拟),但在SQL中执行分页的方式却完全不同,更快。这通常被称为“搜索方法”,如本博客文章中所述。
SELECT TOP 10 first_name, last_name, score
FROM players
WHERE (score < @previousScore)
OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC
该@previousScore和@previousPlayerId值是来自前一页的最后一条记录的相应值。这允许您获取“下一页”。如果ORDER BY方向是ASC,只需使用>。
使用上述方法,您无法在未先读取前40条记录的情况下立即跳转到第4页。但通常情况下,你不想跳得那么远。相反,您可以获得更快的查询,该查询可能能够在固定时间内获取数据,具体取决于您的索引。此外,无论基础数据是否发生变化,您的页面都将保持“稳定”状态(例如,在第4页上,当您在第4页时)。
例如,这是在Web应用程序中延迟加载更多数据时实现分页的最佳方法。
注意,“搜索方法”也称为键集寻呼。
添加回答
举报