高性能分页 利用Set Rowcount函数分页

摘要:
使用SetRowCount,我们可以很容易地实现它。当然,使用SetRowCount,我们仍然使用Top吗?让我们看看SetRowcount如何帮助我们:Declare@IDintDeclare @ MoveRecordsint--@CurrentPage在参数中传递@PageSizeSet@MoveRecords=@CurrentPage*@PageSize+1--以下两行可以快速滚动到要检索并记录ID的数据行SetRowcount@MoveRecordsSelect@ID=IDfromTable1OrderbyIDSetRowcount@PageSize--我讨厌使用*来减少麻烦,但为了方便起见,暂时使用Select*FromTable1WhereID˃=@IDOrderByIDSetRowcount0。你可以试试。在一个有1000 W记录的表中,立即将页面转到第100页,看看它有多快!

自己测试用的代码

http://www.cnblogs.com/gowhy/archive/2011/04/19/2020638.html
Declare @ID int
Declare @MoveRecords int
Declare @CurrentPage int
Declare @PageSize int

set @CurrentPage=1
set @PageSize=2
--@CurrentPage和@PageSize是传入参数
Set @MoveRecords=@CurrentPage * @PageSize+1
 
--下面两行实现快速滚动到我们要取的数据的行,并把ID记录下来
Set Rowcount @MoveRecords
Select @ID=id from [Table] Order by id
 
Set Rowcount @PageSize
--最恨为了减少麻烦使用*了,但是在这里为了说明方便,暂时用一下
Select * From [Table] Where id>=@ID Order By id
Set Rowcount 0

高性能分页

    SQLServer中有一个Set Rowcount的的设置,它的意思是使命令的处理在响应指定的行数之后停止处理命令,利用这个特点,我们可以借用它来在一个千万行级数据表中实现高性能分页查询。先来说说实现方式: 
      1、我们来假定Table中有一个已经建立了索引的主键字段ID(整数型),我们将按照这个字段来取数据进行分页。 
      2、页的大小我们放在@PageSize中 
      3、当前页号我们放在@CurrentPage中 
      4、如何让记录指针快速滚动到我们要取的数据开头的那一行呢,这是关键所在!有了Set RowCount,我们就很容易实现了。 
      5、如果我们成功地滚动记录指针到我们要取的数据的开头的那一行,然后我们把那一行的记录的ID字段的值记录下来,那么,利用Top和条件,我们就很容易的得到指定页的数据了。当然,有了Set RowCount,我们难道还用Top么? 
      看看Set Rowcount怎么来帮我们的忙吧: 
 
 
Declare @ID int 
Declare @MoveRecords int 
 
--@CurrentPage@PageSize是传入参数 
Set @MoveRecords=@CurrentPage * @PageSize+1 
 
--下面两行实现快速滚动到我们要取的数据的行,并把ID记录下来 
Set Rowcount @MoveRecords 
Select @ID=ID from Table1 Order by ID 
 
Set Rowcount @PageSize 
--最恨为了减少麻烦使用*了,但是在这里为了说明方便,暂时用一下 
Select * From Table1 Where ID>=@ID Order By ID 
Set Rowcount 0 
 
      大家可以试试看,在一个1W记录的表里面,一下子方翻页到第100页(每页100条),看看有多快! 
 
因为平常 倒序 排的比较多,上面也很好改。  
将 Order by ID 改成 Order by ID DESC  
将 Where ID>=@ID Order By ID 改成 Where ID<=@ID Order By ID DESC  
就可以了. 

 
复制代码
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
Create PROCEDURE [dbo].[Tag_Page_Name_Select]
-- 传入最大显示纪录数和当前页码
    @MaxPageSize int,
    
@PageNum int,
-- 设置一个输出参数返回总纪录数供分页列表使用
    @Count int output
AS
BEGIN
    
SET NOCOUNT ON;

   
DECLARE
-- 定义排序名称参数
        @Name nvarchar(50),
-- 定义游标位置
        @Cursor int
-- 首先得到纪录总数
   Select @Count = count(tag_Name)
     
FROM [viewdatabase0716].[dbo].[view_tag];
-- 定义游标需要开始的位置
    Set @Cursor = @MaxPageSize*(@PageNum-1)+1
-- 如果游标大于纪录总数将游标放到最后一页开始的位置
    IF @Cursor > @Count
    
BEGIN
-- 如果最后一页与最大每次纪录数相等,返回最后整页
        IF @Count % @MaxPageSize = 0
        
BEGIN
            
IF @Cursor > @MaxPageSize
                
Set @Cursor = @Count - @MaxPageSize + 1
            
ELSE
                
Set @Cursor = 1
        
END
-- 否则返回最后一页剩下的纪录
        ELSE
            
Set @Cursor = @Count - (@Count % @MaxPageSize+ 1
    
END
-- 将指针指到该页开始
    Set Rowcount @Cursor
-- 得到纪录开始的位置
    Select @Name = tag_Name
     
FROM [viewdatabase0716].[dbo].[view_tag]
    
orDER BY tag_Name;
-- 设置开始位置
    Set Rowcount @MaxPageSize
-- 得到该页纪录
        Select * 
        
From [viewdatabase0716].[dbo].[view_tag]
        
Where tag_Name >= @Name
        
order By tag_Name

    
Set Rowcount 0
END
复制代码


分页控件

复制代码
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;

/// <summary>
/// 扩展连接字符串
/// </summary>
public class ExStringBuilder
{
    
private StringBuilder InsertString;
    
private StringBuilder PageString;
    
private int PrivatePageNum = 1;
    
private int PrivateMaxPageSize = 25;
    
private int PrivateMaxPages = 10;
    
private int PrivateCount;
    
private int PrivateAllPage;
    
public ExStringBuilder()
    {
        InsertString 
= new StringBuilder("");
    }
    
/// <summary>
    
/// 得到生成的HTML
    
/// </summary>
    public string GetHtml
    {
        
get
        {
            
return InsertString.ToString();
        }
    }
    
/// <summary>
    
/// 得到生成的分页HTML
    
/// </summary>
    public string GetPageHtml
    {
        
get
        {
            
return PageString.ToString();
        }
    }
    
/// <summary>
    
/// 设置或获取目前页数
    
/// </summary>
    public int PageNum
    {
        
get
        {
            
return PrivatePageNum;
        }
        
set
        {
            
if (value >= 1)
            {
                PrivatePageNum 
= value;
            }
        }
    }
    
/// <summary>
    
/// 设置或获取最大分页数
    
/// </summary>
    public int MaxPageSize
    {
        
get
        {
            
return PrivateMaxPageSize;
        }
        
set
        {
            
if (value >= 1)
            {
                PrivateMaxPageSize 
= value;
            }
        }
    }
    
/// <summary>
    
/// 设置或获取每次显示最大页数
    
/// </summary>
    public int MaxPages
    {
        
get
        {
            
return PrivateMaxPages;
        }
        
set
        {
            PrivateMaxPages 
= value;
        }
    }
    
/// <summary>
    
/// 设置或获取数据总数
    
/// </summary>
    public int DateCount
    {
        
get
        {
            
return PrivateCount;
        }
        
set
        {
            PrivateCount 
= value;
        }
    }
    
/// <summary>
    
/// 获取数据总页数
    
/// </summary>
    public int AllPage
    {
        
get
        {
            
return PrivateAllPage;
        }
    }
    
/// <summary>
    
/// 初始化分页
    
/// </summary>
    public void Pagination()
    {
        PageString 
= new StringBuilder("");
//得到总页数
        PrivateAllPage = (int)Math.Ceiling((decimal)PrivateCount / (decimal)PrivateMaxPageSize);
//防止上标或下标越界
        if (PrivatePageNum > PrivateAllPage)
        {
            PrivatePageNum 
= PrivateAllPage;
        }
//滚动游标分页方式
        int LeftRange, RightRange, LeftStart, RightEnd;
        LeftRange 
= (PrivateMaxPages + 1/ 2-1;
        RightRange 
= (PrivateMaxPages + 1/ 2;
        
if (PrivateMaxPages >= PrivateAllPage)
        {
            LeftStart 
= 1;
            RightEnd 
= PrivateAllPage;
        }
        
else
        {
            
if (PrivatePageNum <= LeftRange)
            {
                LeftStart 
= 1;
                RightEnd 
= LeftStart + PrivateMaxPages - 1;
            }
            
else if (PrivateAllPage - PrivatePageNum < RightRange)
            {
                RightEnd 
= PrivateAllPage;
                LeftStart 
= RightEnd - PrivateMaxPages + 1;
            }
            
else
            {
                LeftStart 
= PrivatePageNum - LeftRange;
                RightEnd 
= PrivatePageNum + RightRange;
            }
        }

//生成页码列表统计
        PageString.Append(...);

        StringBuilder PreviousString 
= new StringBuilder("");
//如果在第一页
        if (PrivatePageNum > 1)
        {
            ...
        }
        
else
        {
            ...
        }
//如果在第一组分页
        if (PrivatePageNum > PrivateMaxPages)
        {
            ...
        }
        
else
        {
            ...
        }
        PageString.Append(PreviousString);
//生成中间页
        for (int i = LeftStart; i <= RightEnd; i++)
        {
//为当前页时
            if (i == PrivatePageNum)
            {
                ...
            }
            
else
            {
                ...
            }
        }
        StringBuilder LastString 
= new StringBuilder("");
//如果在最后一页
        if (PrivatePageNum < PrivateAllPage)
        {
            ...
        }
        
else
        {
            ...
        }
//如果在最后一组
        if ((PrivatePageNum + PrivateMaxPages) < PrivateAllPage)
        {
            ...
        }
        
else
        {
            ...
        }
        PageString.Append(LastString);
    }
    
/// <summary>
    
/// 生成Tag分类表格
    
/// </summary>
    public void TagTable(ExDataRow myExDataRow)
    {
        InsertString.Append(...);
    }
复制代码

调用方法:

复制代码
//得到分页设置并放入Session
        ExRequest myExRequest = new ExRequest();
        myExRequest.PageSession(
"Tag_"new string[] { "page""size" });
//生成Tag分页
        ExStringBuilder Tag = new ExStringBuilder();
        
//设置每次显示多少条纪录
        Tag.MaxPageSize = Convert.ToInt32(Session["Tag_size"]);
        
//设置最多显示多少页码
        Tag.MaxPages = 9;
        
//设置当前为第几页
        Tag.PageNum = Convert.ToInt32(Session["Tag_page"]);
        
string[][] myNamenValue = new string[2][]{
            
new string[]{"MaxPageSize","PageNum","Count"},
            
new string[]{Tag.MaxPageSize.ToString(),Tag.PageNum.ToString()}
        };
//调用存储过程
        DataTable myDataTable = mySQL.BatchGetDB("Tag_Page_Name_Select", myNamenValue, "Count");
        Tag.DateCount 
= (int)mySQL.OutputCommand.Parameters["@Count"].Value;
        Tag.Pagination();

        HeadPage.InnerHtml 
= FootPage.InnerHtml = Tag.GetPageHtml;

        
for (int i = 0, j = myDataTable.Rows.Count; i < j; i++)
        {
            Tag.TagTable(
new ExDataRow(myDataTable.Rows[i]));
        }
        TagBox.InnerHtml 
= Tag.GetHtml;

免责声明:文章转载自《高性能分页 利用Set Rowcount函数分页》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇XShell/Xftp 无法连接 Ubuntu20reponse.getWriter和JSP中的out.printe的区别;下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【无限滚动加载数据】—infinite-scroll插件的使用

网上对于infinite-scroll插件使用的例子不多。但由于它的出现,鼓吹了瀑布流形式的页面展示方式,所以不得不了解了解这种新的分页方式。 官网上有对infinite-scroll的详细描述,但一般人即使看未必看得懂,看得懂未必就调试成功。所以借今晚有点时间,把跑通的例子供大家借鉴。 一.无限滚动概念 首先,它是基于Jquery的,另外还要明白无限...

MVC中用Jpaginate分页

MVC中用Jpaginate分页 So easy!(兼容ie家族) 看过几款分页插件,觉得Jpaginate比较简约,样式也比较容易的定制,而且体验也比较好,支持鼠标滑动效果。先上效果图: 整个过程很简单,只需要3步 一、引入相关样式和脚本: 1.MVC4中,用了Bundles,你可以把同一个类型多个样式或者脚本的捆绑在一起。调用的时候更加简洁,便于管...

table表单打印添加页码和自动分页

今天接到一个需求,就是打印页面需要自动分页,并且添加分页页码。 查找了很多插件或者文档都没有好的处理方法,所以准备自己写一个函数来处理。 页面样式: 要求:第一个页面添加总体的大表单,第二个页面添加小表单。并且自动分页,添加页码。table列表中如果有note字段的话,需要另起一行添加备注,如果没有则隐藏,字数最多为200字。 先说思路: 1. 可以将页...

web列表分页与问题

之前做过很多分页,只是拿别人的模板照抄下来。今天做一个分页的时候自己认真分析了一下,里面问题还挺多的。 业务场景:系统做一个web容器的发布系统,需要有个发布历史的页面。 问题: 1、分页机制的原因 2、一般的实现方式 3、自己考虑的实现方式为什么不行 回答: 1、原因:数据量太多,全部列出来不方便查看,对客户端和服务端的压力也比较大。 比如发布系统用了3...

Bootstrap Table 中文文档(完整翻译版)

表格参数: 名称 标签 类型 默认 描述 - data-toggle String ‘table’ 不用写 JavaScript 直接启用表格。 classes data-classes String ‘table table-hover’ 表格的类名称。默认情况下,表格是有边框的 你可以添加 ‘table-no-bordered’ 来删除...

c#分页工具类,完美实现List分页

using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ProjectProgress.BLL { /// <summary> /// 分页工具类 /// </s...