zoukankan      html  css  js  c++  java
  • 浅谈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分页查询方面能有所帮助。

  • 相关阅读:
    Linnia学习记录
    漫漫考研路
    ENS的学习记录
    KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定
    KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定
    KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定
    KnockoutJS 3.X API 第四章 数据绑定(1) 文本及样式绑定
    KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
    KnockoutJS 3.X API 第三章 计算监控属性(4)Pure computed observables
    KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
  • 原文地址:https://www.cnblogs.com/encounter/p/2188786.html
Copyright © 2011-2022 走看看