7

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

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

SQL 2005出现时,我发现Row_Number()并且从那时起我就一直在使用它......

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

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

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

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

提前致谢。

PS有谁知道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

发布日期:日期时间

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

4

2 回答 2

8

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”列上的索引?

于 2008-10-04T03:09:31.347 回答
1

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

难怪你会超时。

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

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

.

于 2008-10-20T20:42:56.177 回答