大 哥

导航

三种SQL分页法效率分析

表中主键必须为标识列,[ID] int IDENTITY (1,1)

1.分页方案一:(利用Not In和SELECT TOP分页)

 语句形式:利用Not In和SELECT TOP分页) 效率中,需要拼接SQL语句

   SELECT TOP 10 * FROM   TestTable WHERE (Id   NOT   IN (SELECT   TOP   20    id   FROM         TestTable ORDER BY id )) ORDER BY ID

2.分页方案二:(利用ID大于多少和SELECT TOP分页)

   语句形式:利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句

   SELECT TOP 10 * FROM   TestTable WHERE (ID   > (SELECT     MAX(id)    FROM (SELECT   TOP    20   id FROM    TestTable ORDER BY id) AST))

3.分页方案三:(利用SQL的游标存储过程分页)

语句形式:利用SQL的游标存储过程分页) 效率最差,但是最为通用

   create procedure SqlPager

@sqlstr nvarchar(4000),                --查询字符串

@currentpage int,                      --第N页

@pagesize int                         --每页行数

as

set nocount on

declare @P1 int,                       --P1是游标的id

   @rowcount int

exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output

select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页

set @currentpage=(@currentpage-1)*@pagesize+1

exec sp_cursorfetch @P1,16,@currentpage,@pagesize

exec sp_cursorclose @P1

set nocount off

 

当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

posted on 2010-01-04 21:35  VIP-爷  阅读(171)  评论(0)    收藏  举报