SQL Server 2005下的分页SQL

其实基本上有三种方法:

1、使用SQL Server 2005中新增的ROW_NUMBER

几种写法分别如下:

1 None.gif SELECT   TOP   20   *   FROM  ( SELECT
2 None.gif   ROW_NUMBER()  OVER  ( ORDER   BY  Namec)  AS  RowNumber,
3 None.gif    *
4 None.gif FROM
5 None.gif   dbo.mem_member) _myResults
6 None.gif WHERE
7 None.gif   RowNumber  >   10000
8 None.gif

 

1 None.gif SELECT   *   FROM  ( SELECT
2 None.gif   ROW_NUMBER()  OVER  ( ORDER   BY  Namec)  AS  RowNumber,
3 None.gif    *
4 None.gif FROM
5 None.gif   dbo.mem_member) _myResults
6 None.gif WHERE
7 None.gif   RowNumber  between   10000   and   10020

 

1 None.gif WITH  OrderedResults  AS  
2 None.gif
3 None.gif( SELECT   * , ROW_NUMBER()  OVER  ( order   by  Namec)  as  RowNumber  FROM  dbo.mem_member)
4 None.gif
5 None.gif SELECT   *  
6 None.gif
7 None.gif FROM  OrderedResults
8 None.gif
9 None.gif WHERE  RowNumber  between   10000   and   10020

不管哪种写法,性能都不理想。在8,9万条数据的情况下要运行6秒左右。


2、使用临时表再加存储过程

 1 None.gif BEGIN
 2 None.gif                 DECLARE   @PageLowerBound   int
 3 None.gif                 DECLARE   @PageUpperBound   int
 4 None.gif                
 5 None.gif                 --  Set the page bounds
 6 None.gif                  SET   @PageLowerBound   =   10000
 7 None.gif                 SET   @PageUpperBound   =   10020
 8 None.gif
 9 None.gif                 --  Create a temp table to store the select results
10 None.gif                  Create   Table  #PageIndex
11 None.gif                (
12 None.gif                     [ IndexId ]   int   IDENTITY  ( 1 1 NOT   NULL ,
13 None.gif                     [ Id ]   varchar ( 18
14 None.gif                )
15 None.gif                
16 None.gif                 --  Insert into the temp table
17 None.gif                  declare   @SQL   as   nvarchar ( 4000 )
18 None.gif                 SET   @SQL   =   ' INSERT INTO #PageIndex (Id) '
19 None.gif                 SET   @SQL   =   @SQL   +   '  SELECT '
20 None.gif                 SET   @SQL   =   @SQL   +   '  TOP  '   +   convert ( nvarchar @PageUpperBound )
21 None.gif                 SET   @SQL   =   @SQL   +   '  m_id '
22 None.gif                 SET   @SQL   =   @SQL   +   '  FROM dbo.mem_member '
23 None.gif                 SET   @SQL   =   @SQL   +   '  ORDER BY NameC '
24 None.gif                
25 None.gif                 --  Populate the temp table
26 None.gif                  exec  sp_executesql  @SQL
27 None.gif
28 None.gif                 --  Return paged results
29 None.gif                  SELECT  O. *
30 None.gif                 FROM
31 None.gif                    dbo.mem_member O,
32 None.gif                    #PageIndex PageIndex
33 None.gif                 WHERE
34 None.gif                    PageIndex.IndexID  >   @PageLowerBound
35 None.gif                     AND  O. [ m_Id ]   =  PageIndex. [ Id ]
36 None.gif                 ORDER   BY
37 None.gif                    PageIndex.IndexID
38 None.gif                
39 None.gif drop   table  #PageIndex            
40 None.gif                 END

而使用这种方法,在同样的情况下用时只需1秒。

看样子,row_number是个鸡肋。

3、如果觉得临时表不好,还可以使用SET ROWCOUNT

 1 None.gif begin
 2 None.gif DECLARE   @first_id   varchar ( 18 ),  @startRow   int
 3 None.gif    
 4 None.gif SET   ROWCOUNT   10000
 5 None.gif SELECT   @first_id   =  m_id  FROM  mem_member  ORDER   BY  m_id
 6 None.gif
 7 None.gif SET   ROWCOUNT   20
 8 None.gif
 9 None.gif SELECT  m. *  
10 None.gif FROM  mem_member m
11 None.gif WHERE  m_id  >=   @first_id
12 None.gif ORDER   BY  m.m_id
13 None.gif
14 None.gif SET   ROWCOUNT   0
15 None.gif end

不过,这种方法有缺点。按ID排序就快,按其他字段排序就慢。

大家有什么意见,欢迎拍砖。

参考文章:

http://www.4guysfromrolla.com/webtech/042606-1.shtml

http://www.4guysfromrolla.com/webtech/041206-1.shtml

http://www.singingeels.com/Articles/Pagination_In_SQL_Server_2005.aspx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值