【问题标题】:Efficient paging with large tables in sql 2008sql 2008中大表的高效分页
【发布时间】:2011-01-27 13:15:22
【问题描述】:

适用于超过 1,000,000 行甚至更多行的表格!

我自己没有做过任何基准测试,所以想征求专家的意见。

看过一些关于 row_number() 的文章,但似乎对性能有影响

还有哪些其他选择/替代方案?

【问题讨论】:

标签: sql sql-server performance pagination paging


【解决方案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。
猜你喜欢
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 2014-01-14
  • 2011-06-19
相关资源
最近更新 更多