编辑:我还在等待更多的答案。谢谢!
在 SQL 2000 的日子里,我曾经使用临时表方法,你用新的标识列和主键创建一个临时表,然后选择 A 和 B 之间的标识列。
当 SQL 2005 我发现了 Row_Number()
从那以后我一直在使用它......
但是现在,我发现 Row_Number()
存在严重的性能问题。 .
当您处理不那么庞大的结果集并对标识列进行排序时,它的性能非常好。然而,它的性能很差 当您与 一起工作时大型结果集 像超过 10,000 条记录和 对非标识列进行排序 . Row_Number()
如果结果集超过 250,000 条记录,即使按标识列排序,性能也会很差。对我来说,它到了抛出错误的地步,“ 命令超时!”
你用什么在 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(自增)、主键
发布日期:日期时间
编辑:每个人都在使用 Row_Number() 吗?
最佳答案
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' 列的索引吗?
关于sql-server-2005 - 在 SQL Server 2005 中对非常大的结果集进行分页的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/169596/