【问题标题】:Which paging method (Sql Server 2008) for BEST performance?哪种分页方法 (Sql Server 2008) 性能最佳?
【发布时间】:2009-07-03 11:28:58
【问题描述】:

在 Sql Server 2008 中,许多选项可用于通过存储过程进行数据库分页。例如,请参阅 here 和 here。

选项:

  1. ROW_NUMBER() 函数
  2. 行数
  3. 光标
  4. 临时表
  5. 嵌套 SQL 查询
  6. 其他

已知使用 ROW_NUMBER() 的分页具有 performance issues:

请指教,哪种分页方法性能最好(对于带有 JOIN 的大表)?

如果可能,还请提供相关文章的链接。

谢谢。

【问题讨论】:

  • 您可能应该添加一些 300 代表赏金以匹配您要求的详细程度......

标签: sql-server paging


【解决方案1】:

您必须回答的一个问题是,您是否想向最终用户显示总行数。要计算最后一页的编号,还需要最后一行的编号。

如果您可以不用这些信息,那么临时表是一个不错的选择。您可以选择 pirmary 密钥并使用 LIMIT 检索您感兴趣的密钥。如果您这样做正确,典型的用例将只检索前几页。

如果需要最后页码,可以使用 ROW_NUMBER()。使用临时表不会快多少,因为您不能使用 LIMIT 子句,这使得该策略相当于 ROW_NUMBER() 计算。

【讨论】:

  • +1 这是一个重要的区别——实际上我总是需要总行数。不包括对我没用的性能测试。
  • 谢谢。生成页码需要总行数。 ROWCOUNT 方法似乎是最快的,但需要唯一的排序列(在我的情况下这不是唯一的)
【解决方案2】:

我们可以使用以下查询获得行数。

WITH data AS
(
      SELECT ROW_NUMBER() OVER (order by memberid ) AS rowid, memberid 
      FROM Customer
)
SELECT *, (select count(*) from data) AS TotalCount 
FROM data 
WHERE rowid > 20 AND  rowid <= 30

【讨论】:

  • OP 知道,他在问最好的方法是什么,并明确链接到另一个用这种方法描述问题的地方(链接到另一个解决方案)。
猜你喜欢
  • 2011-05-20
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2010-09-18
  • 1970-01-01
相关资源
最近更新 更多