快速业务通道

ASP.NET 2.0数据教程之二十五:大数据量时提高分页的效率

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
SQL 1
       2
       3 SELECT columnList,
       ROW_NUMBER() OVER(orderByClause)
       FROM TableName

ROW_NUMBER()返回一个根据指定排 序的表示每条记录的等级的值.比如,我们可以用以下居于查看根据价格来排序(降 序)的每个product的等级:

SQL 1
       2
       3 SELECT ProductName, UnitPrice,
       ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank
       FROM Products

图5 是在Visual Studio里运行以上代码的结果. 注意product根据价格排序,每行有一个等 级.

ASP.NET 2.0数据教程之二十五:大数据量时提高分页的效率

图 5: 返回的记录里每行有一个Price Rank

注意: ROW_NUMBER () 只是 SQL Server 2005里很多排级的功能中的一种. 想了解更多的 ROW_NUMBER()的讨论,包括其它的排级功能,请看 Returning Ranked Results with Microsoft SQL Server 2005.

当使用OVER从句里的ORDER BY 列名 (UnitPrice)来排级时,SQL Server会对结果排序.为了提升大数据量查询时的性能 ,可以为用来排序的列加上非聚集索引.更多的性能考虑参考Ranking Functions and Performance in SQL Server 2005.

ROW_NUMBER()返回的等级信息无 法直接在WHERE从句中使用.而在From后面的Select里可以返回ROW_NUMBER(),并在 WHERE从句里使用.比如,下面的语句使用一个From后的Select返回 ProductName,UnitPrice,和ROW_NUMBER()的结果,然后使用一个WHERE从句来返回 price rank在11到20之间的product.

SQL 1
       2
       3
       4
       5
       6
      7 SELECT PriceRank, ProductName, UnitPrice
       FROM
       (SELECT ProductName, UnitPrice,
       ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank
       FROM Products
       ) AS ProductsWithRowNumber
       WHERE PriceRank BETWEEN 11 AND 20

更进一步,我们可以根据这个方法返回给定 Start Row Index 和Maximum Rows 的页的数据.

SQL 1
       2
       3
       4
       5
       6
      7 SELECT PriceRank, ProductName, UnitPrice
       FROM
       (SELECT ProductName, UnitPrice,
       ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank
       FROM Products
       ) AS ProductsWithRowNumber
这 种方法非常有效. 但是对接近尾部的页来说,这种方法的效率和默认分页时差不多 .

本教程用ROW_NUMBER()来实现自定义分页.如果需要知道更多的关于 table变量和SET ROWCOUNT的技术,请看 A More Efficient Method for Paging Through Large Result Sets.

以下语句用来使用ROW_NUMBER()将一个等级 和返回的每条记录关联:

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号