浅谈SQL Server2005的几种分页方法

SQL Server分页查询是我们经常会用到的功能,其实现方法也有很多,本文的几种分页方法摘自《SQL Server2005性能调优》一书。希望对您学习SQL Server分页查询方面能有所帮助。

用以下脚本生成测试数据:

  1. CREATE TABLE TRANS_TABLE(  
  2.         MYID   INT IDENTITY(1,1) NOT NULL PRIMARY KEY,  
  3.         MYDESC VARCHAR(10),  
  4.         MYDATE DATETIME,  
  5.         MYGROUPID INT)  
  6. DECLARE @I INT 
  7. SET @I = 0WHILE @I < 1000000  
  8. BEGIN 
  9.     INSERT INTO TRANS_TABLE  
  10.     SELECT CHAR(ASCII('A') - 2 + (2 * (1 + ABS(CHECKSUM(NEWID())) % 26))),  
  11.                  DATEADD(dayABS(CHECKSUM(NEWID())) % 365, '01/01/2007'),  
  12.                  (ABS(CHECKSUM(NEWID())) % 10)  
  13.     SET @I = @I + 1  
  14. END 
  15. CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYDATE  
  16. ON TRANS_TABLE(MYDATE)  
  17. CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYGROUPID  
  18. ON TRANS_TABLE(MYGROUPID)  
  19.  

1、基于CTE分页

1)用row_number()排名函数,派生表的方式分页

  1. DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  3. select *  
  4.   from ( select p.*, rownum rnum  
  5.          FROM (  
  6.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, *  
  7.             FROM TRANS_TABLE (NOLOCK)  
  8.                 ) p  
  9.           where rownum <= @START_ROW + @MAX_ROWS - 1  
  10.        )  
  11.  z where rnum >= @START_ROW  
  12.  

2)用CTE方式取代派生表

  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3. WITH PAGED AS (  
  4.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,     *  
  5.             FROM TRANS_TABLE (NOLOCK)  
  6.             )  
  7. SELECT *  
  8. FROM PAGEDWHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS-1 

3)也是CTE方法,但是根据测试数据显示这种性能比前两种都好

  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3. WITH PAGED AS (  
  4.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, MYID  
  5.             FROM TRANS_TABLE (NOLOCK)  
  6.             )  
  7. SELECT TT.*  
  8. FROM PAGED PGD  
  9. INNER JOIN TRANS_TABLE TT  
  10. ON PGD.MYID = TT.MYID  
  11. WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1  
  12. ORDER BY MyDate, MYID  

2、  基于ROW_COUNT的分页

  1. DECLARE     @START_ID int, @START_ROW int, @MAX_ROWS int,  
  2.          @START_DATETIME DATETIME, @TOT_ROW_CNT INT 
  3. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  4. -- Get the first row for the page  
  5. SET ROWCOUNT @START_ROW  
  6. SELECT @START_ID = MYID, @START_DATETIME = MYDATE FROM TRANS_TABLE (NOLOCK)  
  7.         ORDER BY MYDATE, MYID  
  8. -- Now, set the row count to MaximumRows and get  
  9. -- all records >= @first_idSET ROWCOUNT @MAX_ROWS  
  10. SELECT *  
  11. FROM TRANS_TABLE (NOLOCK)  
  12. WHERE MYID >= @START_ROW  
  13. AND MYDATE >= @START_DATETIME  
  14. ORDER BY MYDATE, MYID  
  15. SET ROWCOUNT 0  

3、  TOP @X分页

SQL Server 2005中可以把返回行数做为参数传给top语句。

  1. DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT INT, @START_DESC VARCHAR(10)  
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  3. -- Get the first row for the page  
  4. SELECT TOP(@START_ROW) @START_ID = MYID, @START_DESC = MYDESC FROM TRANS_TABLE (NOLOCK)  
  5.     ORDER BY MYDESC, MYID  
  6. SELECT TOP(@MAX_ROWS) *  
  7. FROM TRANS_TABLE (NOLOCK)  
  8. WHERE MYID >= @START_ROW  
  9. AND MYDESC >= @START_DESC  
  10. ORDER BY MYDESC, MYID  
  11.  

4、  Temp表分页

  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3.     SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,  
  4.          MYID  
  5.     into #TEMP 
  6.     FROM TRANS_TABLE (NOLOCK)  
  7. SELECT TT.*  
  8. FROM TRANS_TABLE (NOLOCK) TT  
  9. INNER JOIN #TEMP TON TT.MYID = T.MYID  
  10. WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1  
  11. DROP TABLE #TEMP 
  12.  

以上便是这次为您介绍的 SQL Server 2005中几种分页方法,希望对您学习SQL Server分页查询方面能有所帮助。

原文链接:http://www.cnblogs.com/qiuwuyu/archive/2011/03/21/1989870.html

【编辑推荐】

  1. Access分页方案
  2. 浅谈如何构建高效的MySQL分页
  3. Oracle分页查询语句的写法
  4. Oracle、SQL和DB2分页查询写法介绍

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/304195.html<

(0)
管理的头像管理
上一篇2025-05-25 14:52
下一篇 2025-05-25 14:54

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注