在SQL Server 2005中分析非常大的结果集的有效方法是什么?

Bri*_*Kim 6 performance pagination sql-server-2005

编辑: 我还在等待更多答案.谢谢!

在SQL 2000天,我曾经使用临时表方法,您在其中创建具有新标识列和主键的临时表,然后选择A和B之间的标识列.

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

但现在,我发现了严重的性能问题Row_Number().当您使用不那么巨大的结果集并对标识列进行排序时,它的表现非常好.但是,当您处理超过10,000条记录的大型结果集并将其排序到非标识列时,它的性能非常差.即使您按标识列排序,如果结果集超过250,000条记录,也会表现不佳.对我来说,它突然出现错误," 命令超时! "Row_Number()

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

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

让我知道你在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
Run Code Online (Sandbox Code Playgroud)

postID:Int,Identity(自动增量),主键

postDate:DateTime

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

Mit*_*eat 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
Run Code Online (Sandbox Code Playgroud)

...你有一个column_list的覆盖索引和/或'OrderByColumnName'列的索引吗?


lig*_*t78 1

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

难怪你会超时。

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

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