0
点赞
收藏
分享

微信扫一扫

最快的存储过程分页 50W


过程一:
select top N条记录 * from 文章表 where id not in(select top M条记录 id from 文章表 order by id desc ) order by id desc

过程二:
select top N条记录 * from 文章表 where id <(select min(id) from (select top M条记录 id from 文章表 order by id desc ) as tblTmp) order by id desc

--简单通用

CREATE PROCEDURE [dbo].[PageView]
     @select VARCHAR(max),
     @CurrentPage INT,
     @PageSize INT
 AS
 BEGIN
     declare @sql NVARCHAR(max)
     DECLARE @RecordCurrent INT
     DECLARE @PageCount INT
     DECLARE @RecordCount INT
     SET NOCOUNT ON
     set @sql='select @RecordCount=count(*) from ('+@select+') a'
     exec sp_executesql @sql,N'@RecordCount int output',@RecordCount output
     SET @PageCount=(@RecordCount+@PageSize-1)/@PageSize
     IF ISNULL(@CurrentPage,0)<1
         SET @CurrentPage=1
     ELSE if ISNULL(@CurrentPage,0)>@PageCount
         SET @CurrentPage=@PageCount
     SELECT @CurrentPage AS CurrentPage,@RecordCount AS RecordCount,@PageSize AS PageSize,@PageCount AS PageCount
     set @sql='select * from ('+@select+') a where rownumber between '+cast((@CurrentPage-1)*@PageSize+1 as varchar)+' and '+cast(@CurrentPage*@PageSize as varchar)
     exec (@sql)
 END
 --使用not in 方式的存储过程
 create PROCEDURE GetPageDataByNotIn
 @PageIndex int,/**//*当前页数*/ 
 @PageSize int/**//*每页大小*/ 
 AS
 declare @starttime datetime
     set @starttime=getdate()
 IF @PageIndex > 0
 BEGIN
 set nocount on;
 DECLARE @PageLowerBound int
 DECLARE @StartID int
 DECLARE @sql varchar(225)
 SET @PageLowerBound = @PageSize * (@PageIndex-1)
 IF @PageLowerBound<1
    SET @PageLowerBound=1
     print @PageLowerBound
 select top (@PageSize) * from table where [ar_id] not in (select top ((@PageSize)*(@PageIndex-1)) ar_id from table )
 EXEC(@sql)
 set nocount off; 
 END
 print '耗时='+convert(varchar(30),datediff(ms,@starttime,getdate()))
 -------------------------------------------------------------------------------------------------------
 --使用ROWCOUNT的分页存储过程
 create PROCEDURE GetPageData
 @PageIndex int,/**//*当前页数*/ 
 @PageSize int/**//*每页大小*/ 
 AS
 declare @starttime datetime
     set @starttime=getdate()
 IF @PageIndex > 0
 BEGIN
 set nocount on;
 DECLARE @PageLowerBound int
 DECLARE @StartID int
 DECLARE @sql varchar(225)
 SET @BeginIndex = @PageSize * (@PageIndex-1)
 IF @BeginIndex<1
    SET @BeginIndex=1
 SET ROWCOUNT @BeginIndex
 SELECT @StartID = [ar_id] FROM table ORDER BY ar_id 
 print @StartID
 SET ROWCOUNT 0
 SET @sql='select top '+str(@PageSize) +' * from table where [ar_id]>='+ str(@StartID) +' ORDER BY [ar_id] '
 EXEC(@sql)
 set nocount off; 
 END
 print '耗时='+convert(varchar(30),datediff(ms,@starttime,getdate()))

-----------------------------------------------------------------------------------------------------
测试查询一张有100W条数据的表table,每页显示10条数据
存储过程                        第1页   第10页   第100页   第1000页   第5000页  
GetPageDataByNotIn    0           0            126           13530       等了2分多钟没耐性了....
GetPageData                0           0            0               16              76

------------------------------------------------------------------------------------------------------------
最后使用的存储过程(推荐):

create PROCEDURE GetPageData
 (
 @TableName varchar(30),--表名称
 @IDName varchar(20),--表主键名称
 @PageIndex int,--当前页数 
 @PageSize int--每页大小 
 )
 AS
 IF @PageIndex > 0
 BEGIN
 set nocount on
    DECLARE @PageLowerBound int,@StartID int,@sql nvarchar(225)
    SET @PageLowerBound = @PageSize * (@PageIndex-1)
    IF @PageLowerBound<1
     SET @PageLowerBound=1
    SET ROWCOUNT @PageLowerBound
    SET @sql=N'SELECT @StartID = ['+@IDName+'] FROM  '+@TableName+' ORDER BY '+@IDName      exec sp_executesql @sql,N'@StartID int output',@StartID output
    SET ROWCOUNT 0
    SET @sql='select top '+str(@PageSize) +' * from  '+@TableName+' where ['+@IDName+']>='+ str(@StartID) +' ORDER BY ['+@IDName+'] '
    EXEC(@sql)
 set nocount off
 END

举报

相关推荐

0 条评论