浅谈SQL Server2005的几种分页方法

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

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

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

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

1、基于CTE分页

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

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

2)用CTE方式取代派生表

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

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

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

2、  基于ROW_COUNT的分页

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

3、  TOP @X分页

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

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

4、  Temp表分页

DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
SELECT @START_ROW = 1, @MAX_ROWS = 25;  
    SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,  
         MYID  
    into #TEMP 
    FROM TRANS_TABLE (NOLOCK)  
SELECT TT.*  
FROM TRANS_TABLE (NOLOCK) TT  
INNER JOIN #TEMP TON TT.MYID = T.MYID  
WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1  
DROP TABLE #TEMP 
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 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分页查询写法介绍

 

责任编辑:艾婧 来源: 博客园
相关推荐

2010-09-03 10:40:30

SQL删除

2010-09-14 15:14:49

查看SQL Serve

2010-09-06 11:46:03

SQL Server语句

2010-09-09 16:10:57

sql server2循环

2010-10-21 15:13:20

SQL Server系

2013-03-01 11:27:27

SQL Server2SQL Server

2009-07-22 13:49:40

JSP JDBC

2010-07-19 10:15:33

SQL Server2

2010-07-14 16:28:07

SQL server2

2011-09-07 15:11:31

SQL Server同步

2010-07-12 11:06:37

SQL Server2

2010-10-21 16:38:27

sql server文

2010-09-16 15:25:46

SqlServer20

2010-07-19 08:28:26

Sql Server2

2009-07-23 13:37:45

JDBC连接SQL S

2010-11-10 15:23:55

SQL SERVER

2010-11-10 15:29:40

SQL SERVER

2010-07-01 15:09:47

2010-07-19 17:26:55

SQL Server

2010-11-09 16:14:52

卸载SQL Serve
点赞
收藏

51CTO技术栈公众号