sql数据库存储过程分页

以前用到数据库存储过程分页的时候都是用 not in

但是最近工作的时候,随着数据库记录的不断增大,发现not in的效率 真的不行

虽然都设置了索引,但是当记录达到10w的时候就发现不行了,都是需要好几秒钟,受不了了

所以就想换个方法,直接找到需要的页面的数据库记录的第一个ID,当然这个id是有索引,唯一的

而且是主键,这个也是网上说到的最快的一个方法 ^_^,据说比游标更快(我没用过游标)

CREATE PROCEDURE sp_Image_List_ByCategoryID3
(
 @rowscount int =0 output,
 @categoryid int,
 @currentpage int =1,
 @pagesize int = 20
)
 AS
DECLARE  @SQL nvarchar(2000)
SET @SQL  =  ''
SELECT @rowscount=count(ImageID) FROM  T_Images WHERE CategoryID=@categoryid

IF  @currentpage = 1
 SET  @SQL = @SQL + 'SELECT Top ' + cast(@PageSize as nvarchar(20)) + ' ImageID,ThumbName,ImageCode,BigCategoryid  FROM T_Images WHERE CateGoryID=' + CAST(@categoryid AS VARCHAR(10))+' ORDER BY Imageid DESC '
ELSE
BEGIN
 DECLARE  @Num int
 SET  @Num = @PageSize * (@currentpage - 1)
 SET  @SQL = @SQL + 'DECLARE  @LastID NVARCHAR(100)' + char(13)
 SET  @SQL = @SQL + 'SELECT Top ' + cast(@Num as nvarchar(20)) + ' @LastID= ImageID FROM T_Images WHERE CateGoryID=' + CAST(@categoryid AS VARCHAR(10))+'  ORDER BY Imageid DESC ' + char(13)
 SET  @SQL = @SQL + 'SELECT Top ' + cast(@PageSize as nvarchar(20)) + '  ImageID,ThumbName,ImageCode,BigCategoryid  FROM T_Images WHERE CateGoryID=' + CAST(@categoryid AS VARCHAR(10))+'   AND ImageID < @LastID  ORDER BY Imageid DESC '
END

EXECUTE sp_executesql @SQL
GO

 

 

 

换了这个存储过程过程后,发现真的快了很多,现在的数据是40w,就是检索最后一页,都只需要100多ms,爽多了,ImageID上面做了 联合索引 呵呵

 

转自:http://joyjoe.bokee.com/2261333.html
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值