浅谈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

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

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