编辑: 我还在等待更多答案。谢谢!的
在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中使用高性能分页的用途。而且我也想知道一种创建索引的聪明方法。 我怀疑选择正确的主键和/或索引(群集/非群集)将在这里发挥重要作用。
提前致谢。
P.S。 有谁知道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(自动增量),主键
postDate:DateTime
编辑:是否所有人都使用Row_Number()?
答案 0 :(得分:7)
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'列的索引?
答案 1 :(得分:0)
好吧,对于您的示例查询,如果您在PostDate字段上有索引,则ROW_COUNT应该非常快,有数千行。如果不这样做,服务器需要在PK上执行完整的聚簇索引扫描,几乎加载每个页面,获取PostDate字段,按其排序,确定要为结果集提取的行,然后再次获取这些行。它是一种一遍又一遍地创建临时索引(你可能会在普通中看到一个表/索引假脱机)。
难怪你得到超时。
我的建议:在PostDate DESC上设置一个索引,这是ROW_NUMBER将要经过的 - (ORDER BY PostDate DESC,...)
至于你所指的文章 - 我在过去做了很多分页和SQL Server 2000的东西,没有ROW_COUNT,文章中使用的方法是最有效的方法。它并不适用于所有情况(您需要唯一或几乎唯一的值)。其他一些方法的概述是here。