最快的存储过程分页 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

时间: 2024-10-06 11:58:15

最快的存储过程分页 50W的相关文章

关于存储过程分页,我的测试情况

存储过程|分页 在精华区中关于存储过程分页大概有三种思路分别是:临时表,参见658037 在下提供一个存储过程分页的方法游标,参见658066 一种理论上最快的Web数据库分页方法! set rowcount 方法,参见658606 关于存储过程分页我做了一个10万条记录的表来进行测试结果临时表光建立数据就用了四十秒游标有大小限制,我的机子上最大只能到1万条,更多的就无法用了.set rowcount 方法不错,5000多页,只用不到1秒.呵呵

关于存储过程分页

存储过程|分页 看了几个朋友写的关于存储过程分页的文章,感觉有点问题.starleee和东方蜘蛛希望我能发表点看法,我简单说一下. 首先是allsky的那个分页方法根本就不成立,看看他是这样的:select @iStart=(@iPage-1)*@iPageSizeselect @iEnd=@iStart+@iPageSize+1也就是说,他的开始和结束id按照每页显示数硬算出来的,想要这种方法成立必须满足这样一个条件,即这个论坛只有一个版面,并且id从1开始是连续的,中间不能有间隔,也就是说如

存储过程分页又一方法(使用table变量)(摘)

变量|存储过程|分页 要创建一个返回指定条记录结果的存储过程,首先必须指定返回结果集的条记录数,可以用临时表,也可以用table变量(SQL Server 2000),两个在性能上没有太大的差别,但是,table变量是存储在内存中的,如果你的服务器内存不多的话,可以考虑用临时表,临时表使用硬盘存储结果,临时表需要手工释放对象,而table变量在存储过程结束后自动释放.     下面就是我们要创建的存储过程: create proc GetAuthors@Author_Last_Name as v

ASP的一个简单的用存储过程分页

存储过程|分页 使用这个存储过程可以实现分页的,新手可以看看哦!create proc proPage(@pageid int ,@pagesize int)asbeginif (@pageid=1)begin set rowcount @pagesize select * from test order by idendelsebegin declare @no1 int declare @num int select @num=@pagesize*(@pageid-1) set rowcou

存储过程分页

存储过程|分页 作者:bigeagle if exists(select * from sysobjects where ID = object_id("up_TopicList")) drop proc up_TopicListgo create proc up_TopicList @a_ForumID int , @a_intDays int , @a_intPageNo int , @a_intPageSize tinyint as declare @m_intRecordNum

KMCT分页控件与存储过程分页完美结合---存储过程分页篇

上一篇分页控件(KCMT开源控件之--方便简洁的分页控件)出来以后,好几位网友期待我的存储过程分 页与该控件结合使用的例程,这个星期工作很忙,一直没有时间完成.今天终于抽出时间来完成这篇文章 . 首先从存储过程分页谈起 为什么要选择用存储过程分页呢?其实原因很简单,数据库查询功能的性能终究是有限的.即使我们 对数据库进行了最优配置,对数据表设计再三斟酌,然而一旦面临海量数据,且返回结果集较大的时候, 常规的查询语句就无能为力了.一般说来,当返回的结果集超过总数量的40%时,数据库层面上的优化就

SQLServer2005及以上存储过程分页方法

  最近实习期间,项目开发过程中遇到了分页问题,问题如下: 在项目开发过程中,往往会遇到展示展示内容的问题.当内容数量不多的时候,我们直接用一条"SELECT * FROM ..."将去不内容提取出来也无伤大雅.但是,随着项目的不断扩大,将过多的内容展示在一个页面就显得不合理了,此时,就要用到分页技术. 其实分页,包括前台分页和后台分页. 所谓前台分页:就是一次性后天存储设备取出多页数据,传到前台,再分页展示.前台分页的好处是: 1.当每次去适量数据时,取数据时间并没有太大影响,前台分

请教GridView利用存储过程分页的问题?谢谢!

问题描述 本人属于菜鸟,跪求GridView利用存储过程分页的代码,最好有详细的说明.使用的后台语言为C#,数据库为SQLServer.不胜感谢! 解决方案 解决方案二: 可以用session也可以用隐藏控件之类的解决方案三: 俄搞错了我还以为是状态保存解决方案四: <asp:LabelID="lblPage"runat="server"Text='<%#"第"+(((GridView)Container.NamingContaine

silverlight + wcf(json格式) + sqlserver存储过程分页

silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1.0版本的,silverlight2.0的并不多,自个儿琢磨了一下,发现自己弄一个也并非难事,思路和主要代码分享如下: 1.通用的"海量"数据分页存储过程在做aspx开发时我已经用存储过程分页多年,这个东东是通用的(不管前端用什么语言来做),而且性能也不错,所以这里就直接套过来用了,百度一下"分页存储过程"会