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中大表的高效分页的主要内容,如果未能解决你的问题,请参考以下文章

sql主表分页查询关联子表取任意一条高效方案

My Sql 高效分页

高效多表分页存储过程,可支持多表查询,任意排序

高效的 SQL 表合并和分页

高效的SQLSERVER分页方案

ORACLE分页查询SQL语法——高效的分页