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分页查询方面能有所帮助。

  • 相关阅读:
    EF6.0新特性-DbCommandInterceptor实现非SQL端读写分离
    【转】VS2012 中文版转英文版 英文版转中文版 界面语言切换
    【转】Repository 返回 IQueryable?还是 IEnumerable?
    迟来的零碎笔记
    mysql 列转行,合并字段的方法
    MySQL 5.7.9版本sql_mode=only_full_group_by问题
    mysql实现full outer join
    ubuntu下如何查找某个文件的路径
    mysql之group_concat函数详解
    MySQL 表别名(Alias)
  • 原文地址:https://www.cnblogs.com/encounter/p/2188786.html
Copyright © 2011-2022 走看看