zoukankan      html  css  js  c++  java
  • 最快的存储过程分页 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

  • 相关阅读:
    Android 3.0 r1 API中文文档(108) —— ExpandableListAdapter
    Android 3.0 r1 API中文文档(113) ——SlidingDrawer
    Android 3.0 r1 API中文文档(105) —— ViewParent
    Android 中文 API (102)—— CursorAdapter
    Android开发者指南(4) —— Application Fundamentals
    Android开发者指南(1) —— Android Debug Bridge(adb)
    Android中文API(115)——AudioFormat
    Android中文API(116)——TableLayout
    Android开发者指南(3) —— Other Tools
    Android中文API (110) —— CursorTreeAdapter
  • 原文地址:https://www.cnblogs.com/java20130723/p/3211521.html
Copyright © 2011-2022 走看看