SQL Server 2005下的分页SQL

本文介绍了在SQL Server 2005中实现高效分页查询的三种方法:利用ROW_NUMBER函数、临时表结合存储过程及SETROWCOUNT方法,并对比了它们在大数据量下的性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实基本上有三种方法:

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

几种写法分别如下:

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

 

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

 

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

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


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

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

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

看样子,row_number是个鸡肋。

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

 1None.gifbegin
 2None.gifDECLARE @first_id varchar(18), @startRow int
 3None.gif    
 4None.gifSET ROWCOUNT 10000
 5None.gifSELECT @first_id = m_id FROM mem_member ORDER BY m_id
 6None.gif
 7None.gifSET ROWCOUNT 20
 8None.gif
 9None.gifSELECT m.* 
10None.gifFROM mem_member m
11None.gifWHERE m_id >= @first_id
12None.gifORDER BY m.m_id
13None.gif
14None.gifSET ROWCOUNT 0
15None.gifend

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

转载于:https://www.cnblogs.com/hzuIT/articles/827061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值