sql 2008中大表的高效分页
Posted
技术标签:
【中文标题】sql 2008中大表的高效分页【英文标题】:Efficient paging with large tables in sql 2008 【发布时间】:2011-01-27 13:15:22 【问题描述】:适用于超过 1,000,000 行甚至更多行的表格!
我自己没有做过任何基准测试,所以想征求专家的意见。
看过一些关于 row_number() 的文章,但似乎对性能有影响
还有哪些其他选择/替代方案?
【问题讨论】:
您是否介意分享显示 row_number() 无法执行的文章... 除了最琐碎的查询之外,所有查询都需要索引和最新的统计信息才能正常运行。 复制:***.com/questions/1897436/… 这是关于 google 性能的第一个链接sqlblogcasts.com/blogs/tonyrogerson/archive/2008/05/17/… @marc_s - 你看到上面的链接了吗,这是另一个 - 这个来自微软weblogs.asp.net/eporter/archive/2006/10/17/… 【参考方案1】:我们使用row_number()
效果非常好,并且实际上并没有任何性能问题。我们分页查询的基本结构如下所示:
WITH result_set AS (
SELECT
ROW_NUMBER() OVER (ORDER BY <ordering>) AS [row_number],
x, y, z
FROM
table
WHERE
<search-clauses>
) SELECT
*
FROM
result_set
WHERE
[row_number] BETWEEN a AND b
它适用于我们超过 1,000,000 行的表。
【讨论】:
我理解性能是服务器负载和服务器资源等因素的函数,请参阅上面我的 cmets 中的两个链接以获得备用 pov 正如我所说,我们实际上在生产环境中使用了超过 1,000,000 条记录的表。结果在 我想你有足够的内存,所以这个表是完全缓存的。我刚刚尝试了一个包含 3.000.000 条记录的简单表“人(电子邮件,名字,姓氏)”,但要分页到最后一条记录,上述查询需要 6 秒。我正在使用 sql server 2008 r2。我错过了什么吗? 我使用过这种方法,但我更喜欢只选择行号和记录 ID 到 CTE 中以节省 RAM,而不是整个结果集。然后的想法是使用带有 CTE 的 INNER JOIN 来选择所需行号之间的 recordID 的完整结果集。我不确定这是否更快,但它确实节省了 RAM。以上是关于sql 2008中大表的高效分页的主要内容,如果未能解决你的问题,请参考以下文章