【问题标题】:What is an efficient method of paging through very large result sets in SQL Server 2005?在 SQL Server 2005 中对非常大的结果集进行分页的有效方法是什么?
【发布时间】:2010-09-15 05:42:27
【问题描述】:

编辑: 我仍在等待更多答案。谢谢!

在 SQL 2000 的日子里,我曾经使用临时表方法,您创建一个带有新标识列和主键的临时表,然后选择 A 和 B 之间的标识列。

SQL 2005 出现时,我发现了 Row_Number(),从那以后我就一直在使用它...

但现在,我发现Row_Number() 存在严重的性能问题。 当您使用不太庞大的结果集并对标识列进行排序时,它的性能非常好。但是,当您处理大型结果集(如超过 10,000 条记录)并将其按非标识列排序时,性能非常差。如果结果集超过 250,000 条记录,即使您按标识列排序,Row_Number() 的性能也很差。对我来说,它到了抛出错误的地步,“命令超时!

您在 SQL 2005 上使用什么来对大型结果集进行分页? 在这种情况下临时表方法是否更好?我不确定这种方法using temp table with SET ROWCOUNT 是否会表现得更好...但是有人说如果您有多列主键,则会出现给出错误行号的问题。

就我而言,我需要能够按日期类型列对结果集进行排序...对于我的生产网络应用程序。

让我知道您在 SQL 2005 中使用什么实现高性能分页。而且我还想知道一种创建索引的聪明方法。 我怀疑选择正确的主键和/或索引(集群/非集群)将在这里发挥重要作用。

提前致谢。

附: 有人知道 stackoverflow 使用什么吗?

编辑:我的看起来像...

SELECT postID, postTitle, postDate
FROM
   (SELECT postID, postTitle, postDate, 
         ROW_NUMBER() OVER(ORDER BY postDate DESC, postID DESC) as RowNum
    FROM MyTable
   ) as DerivedMyTable
WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1

postID: Int, Identity (auto-increment), Primary key

postDate: 日期时间

编辑:每个人都在使用 Row_Number() 吗?

【问题讨论】:

    标签: sql-server-2005 performance pagination


    【解决方案1】:

    row_number() 技术应该很快。我已经看到了 100,000 行的良好结果。

    您是否使用类似于以下的 row_number():

    SELECT column_list
    FROM
       (SELECT column_list
             ROW_NUMBER() OVER(ORDER BY OrderByColumnName) as RowNum
        FROM MyTable m
       ) as DerivedTableName
    WHERE RowNum BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1
    

    ...您是否有 column_list 的覆盖索引和/或“OrderByColumnName”列上的索引?

    【讨论】:

      【解决方案2】:

      好吧,如果您的 PostDate 字段上有索引,那么对于您的示例查询,ROW_COUNT 应该非常快,有数千行。如果您不这样做,服务器需要对您的 PK 执行完整的聚集索引扫描,实际上加载每个页面,获取您的 PostDate 字段,按它排序,确定要为结果集提取的行并再次获取这些行。这有点像一遍又一遍地创建临时索引(您可能会在平原看到一个表/索引假脱机)。

      难怪你会超时。

      我的建议:在 PostDate DESC 上设置一个索引,这就是 ROW_NUMBER 将要遍历的内容 - (ORDER BY PostDate DESC, ...)

      至于您所指的文章 - 我过去在没有 ROW_COUNT 的情况下使用 SQL Server 2000 完成了很多分页和内容,文章中使用的方法是最有效的方法。它并非在所有情况下都有效(您需要唯一或几乎唯一的值)。其他一些方法的概述是here

      .

      【讨论】:

        猜你喜欢
        • 2012-03-29
        • 2011-06-04
        • 2010-09-05
        • 2010-09-11
        • 2017-12-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多