sqlserver 高性能分页实现分析

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

大家可以试试看,在一个1千W记录的表里面,一下子方翻页到第100页(每页100条),看看有多快!

因为平常 倒序 排的比较多,上面也很好改。
将 Order by ID 改成 Order by ID DESC
将 Where ID>=@ID Order By ID 改成 Where ID就可以了.
代码如下:
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;

///

/// 扩展连接字符串
///

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(“”);
}
///

/// 得到生成的HTML
///

public string GetHtml
{
get
{
return InsertString.ToString();
}
}
///

/// 得到生成的分页HTML
///

public string GetPageHtml
{
get
{
return PageString.ToString();
}
}
///

/// 设置或获取目前页数
///

public int PageNum
{
get
{
return PrivatePageNum;
}
set
{
if (value >= 1)
{
PrivatePageNum = value;
}
}
}
///

/// 设置或获取最大分页数
///

public int MaxPageSize
{
get
{
return PrivateMaxPageSize;
}
set
{
if (value >= 1)
{
PrivateMaxPageSize = value;
}
}
}
///

/// 设置或获取每次显示最大页数
///

public int MaxPages
{
get
{
return PrivateMaxPages;
}
set
{
PrivateMaxPages = value;
}
}
///

/// 设置或获取数据总数
///

public int DateCount
{
get
{
return PrivateCount;
}
set
{
PrivateCount = value;
}
}
///

/// 获取数据总页数
///

public int AllPage
{
get
{
return PrivateAllPage;
}
}
///

/// 初始化分页
///

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 {
LeftStart = 1;
RightEnd = LeftStart + PrivateMaxPages – 1;
}
else if (PrivateAllPage – PrivatePageNum {
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 {
//为当前页时
if (i == PrivatePageNum)
{

}
else
{

}
}
StringBuilder LastString = new StringBuilder(“”);
//如果在最后一页
if (PrivatePageNum {

}
else
{

}
//如果在最后一组
if ((PrivatePageNum + PrivateMaxPages) {

}
else
{

}
PageString.Append(LastString);
}
///

/// 生成Tag分类表格
///

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 {
Tag.TagTable(new ExDataRow(myDataTable.Rows[i]));
}
TagBox.InnerHtml = Tag.GetHtml;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/451927.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何配置 VSCode 以无缝衔接 ESLint 和 Prettier 进行代码检查和格式化?
上一篇 2025年11月7日 23:40:38
Zookeeper 与 Dubbo 项目启动报错 “Circular reference” 如何解决?
下一篇 2025年11月7日 23:40:49

相关推荐

  • Workerman与PHP协同开发:构建高性能的Web应用程序

    workerman与php协同开发:构建高性能的web应用程序 引言:在今天互联网高速发展的时代,Web应用程序的高性能已成为用户体验和竞争力的重要因素。而PHP作为一种广泛使用的服务器端开发语言,其性能优化一直备受关注。本文将介绍如何利用Workerman与PHP协同开发,从而构建高性能的Web应…

    用户投稿 2026年9月22日
    100
  • 使用Swoole开发高性能的Web爬虫

    使用swoole开发高性能的web爬虫 Web爬虫是一种自动化获取网络数据的工具,它可以在互联网上收集数据,并且可以被应用于各种不同的领域,如搜索引擎、数据分析、竞争对手分析等。随着互联网规模和数据量的快速增长,如何开发一个高性能的Web爬虫变得尤为重要。本文将介绍如何使用Swoole来开发一个高性…

    用户投稿 2026年9月22日
    500
  • 使用Workerman构建高性能的视频直播平台

    使用Workerman构建高性能的视频直播平台 摘要:在现代科技的发展下,视频直播成为一种越来越受欢迎的娱乐方式。然而,直播平台需要处理大量的并发连接和高带宽要求,因此需要一个高性能的解决方案。本文将介绍如何使用PHP的网络通信库Workerman来构建一个高性能的视频直播平台。 引言:随着网络带宽…

    2026年9月22日
    200
  • 使用Workerman实现高性能的在线医疗平台

    使用Workerman实现高性能的在线医疗平台 随着科技的发展,互联网在医疗领域的应用越来越广泛。在线医疗平台为患者和医生提供了一个便捷的沟通渠道,解决了患者就医难、就医贵的问题。为了保证平台的高性能和稳定性,我们可以使用PHP的高性能网络框架Workerman来实现。 Workerman是一种基于…

    2026年9月22日
    000
  • 使用Workerman构建高性能的游戏排行榜服务

    使用Workerman构建高性能的游戏排行榜服务 在当今的游戏世界中,游戏排行榜服务是非常重要的功能之一。游戏排行榜不仅能够给玩家提供一个公平竞争的平台,还能够增加游戏的可玩性和互动性。然而,构建一个高性能的游戏排行榜服务并非易事。本文将介绍如何使用Workerman这个高性能PHP框架来构建一个游…

    2026年9月21日
    200
  • 如何使用ThinkPHP6实现数据库分页

    随着web技术的发展和普及,越来越多的网站采用数据库分页技术,以便更好地展示大量数据。thinkphp作为一种常用的php框架,自然也推出了相应的数据库分页扩展。本篇文章将介绍如何使用thinkphp6实现数据库分页。 一、ThinkPHP的Paginator类 首先,我们需要了解一下ThinkPH…

    用户投稿 2026年9月7日
    000
  • 如何利用Swoole实现高性能的网关服务

    随着互联网的迅速发展和用户数量的爆发式增长,网关服务的重要性也日益凸显。传统的网关服务在应对大量用户的同时,往往会面临性能瓶颈,严重影响系统的响应速度和稳定性。而基于swoole的高性能网关服务可以有效解决这一问题,让网站的访问速度和用户体验得到大幅度提升。 那么,什么是Swoole呢?Swoole…

    用户投稿 2026年9月5日
    400
  • 使用Swoole开发高性能的微服务架构

    使用Swoole开发高性能的微服务架构 随着互联网的快速发展和用户需求的不断增加,微服务架构成为一种流行的解决方案。微服务将一个大型应用程序拆分成多个小而独立的服务,每个服务都可独立开发、测试、部署和扩展。与传统的单体架构相比,微服务架构具有灵活、可扩展、可维护的优势,并能够更好地适应快速变化的业务…

    2026年9月5日
    000
  • 使用Swoole构建高性能的视频直播平台

    使用Swoole构建高性能的视频直播平台 随着互联网的不断发展,视频直播成为越来越流行的一种娱乐方式。为了满足用户对高质量、低延迟的视频直播的需求,构建一个高性能的视频直播平台变得尤为重要。而Swoole作为一个强大的PHP扩展,可以帮助我们实现这个目标。 Swoole是一个高性能的PHP网络通信引…

    2026年9月5日
    200
  • 使用Swoole构建高性能的游戏排行榜服务

    使用Swoole构建高性能的游戏排行榜服务 随着游戏行业的快速发展,游戏排行榜作为玩家之间竞争和交流的重要方式之一,扮演着越来越重要的角色。为了满足大量并发请求和实时数据更新的需求,构建一个高性能的游戏排行榜服务变得至关重要。在这里,我们将使用Swoole来构建一个基于WebSocket的游戏排行榜…

    2026年9月5日
    000
  • 使用Workerman实现高性能的在线预订系统

    使用Workerman实现高性能的在线预订系统 引言:随着互联网的发展和普及,越来越多的企业开始将业务拓展到在线预订系统。传统的预订系统往往面临着性能低下、并发能力不足等问题。而使用Workerman可以轻松实现高性能的在线预订系统。 Workerman简介Workerman是一款基于PHP开发的高…

    2026年9月5日
    100
  • 使用Workerman开发高性能的智能问答系统

    使用Workerman开发高性能的智能问答系统 智能问答系统是一类人工智能应用的重要实现方式,它能够根据用户提出的问题,进行语义分析和自然语言处理,从而给出准确和合理的回答。为了实现高性能的智能问答系统,我们可以使用PHP的开源网络编程框架——Workerman。 Workerman是一款基于PHP…

    2026年9月5日
    100
  • 如何使用Swoole实现高性能的RPC通信

    如何使用Swoole实现高性能的RPC通信 引言: 随着互联网的快速发展,高性能的通信方式成为了软件开发人员关注的焦点之一。在分布式系统中,远程过程调用(RPC)是实现不同节点之间通信的一种重要方式。而传统的RPC通信方式对性能和并发性能有一定的限制。本文将介绍如何使用Swoole扩展来实现高性能的…

    2026年9月1日
    000
  • ThinkPHP开发注意事项:合理使用分页功能

    ThinkPHP是一个强大的PHP开发框架,提供了丰富的功能和组件,方便开发者快速构建Web应用程序。在使用ThinkPHP开发时,经常会遇到需要使用分页功能来展示大量数据的情况。合理使用分页功能可以提升系统性能,用户体验和开发效率。本文将讨论在ThinkPHP开发中,合理使用分页功能的注意事项。 …

    2026年8月31日
    000
  • RuoYi框架代码生成器如何适配SQL Server数据库?

    RuoYi-SQLServer 代码生成器适配:从 MySQL 到 SQL Server 的迁移 ruoyi框架的sqlserver版本(ruoyi-sqlserver)原本只支持mysql数据库的代码自动生成功能,现在需要将其扩展到sql server。这篇文章将探讨如何修改代码,实现sql se…

    用户投稿 2026年8月28日
    200
  • 轻量级高性能的CSS3动画库

      简要教程   Repaintless.css是一款轻量级高性能的CSS3动画库。Repaintless.css通过特殊的方法来制作元素动画,不会引起页面的重绘,使它比其它CSS动画库具有更高的性能。 @@##@@   安装   你可以通过bower或npm来安装Repaintless.css。 …

    2025年12月23日
    000
  • html怎么制作分页效果 内容分页显示实现方法

    html怎么制作分页效果 内容分页显示实现方法html怎么制作分页效果 内容分页显示实现方法html怎么制作分页效果 内容分页显示实现方法html怎么制作分页效果 内容分页显示实现方法

    html本身不能直接实现分页效果,因为它是标记语言,仅负责页面结构。1. 分页需结合后端处理数据并分割内容,2. 前端通过javascript发送请求获取指定页码数据,3. 后端以json格式返回对应数据,4. 前端渲染接收到的数据到页面上,5. 使用javascript动态生成分页导航链接。示例中…

    2025年12月22日 用户投稿
    300
  • 编写高性能HTML应用有哪些点需要注意

    这次给大家带来编写高性能html应用有哪些点需要注意,编写高性能html应用的注意事项有哪些,下面就是实战案例,一起来看一下。 你怎么能提高网页性能?   大多数开发者会通过JavaScript和图片来优化,通过服务器配置,压缩文件和合并文件 – 甚至调整CSS(合并小图片)。   可怜…

    用户投稿 2025年12月21日
    000
  • js如何实现分页功能

    js实现分页的核心是计算总页数并截取对应数据展示,1. 首先准备数据数组alldata,设定每页数量pagesize和当前页currentpage;2. 通过math.ceil(alldata.length / pagesize)计算总页数totalpages;3. 利用slice()方法截取(st…

    2025年12月20日
    300
  • 如何用C++实现桥接模式 抽象与实现分离设计方案

    如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案如何用C++实现桥接模式 抽象与实现分离设计方案

    c++++中桥接模式的核心优势在于解耦抽象与实现,使其能独立变化。1. 它通过将一个类中可能变动的具体操作抽离为独立的实现体系,降低类组合数量,避免“m x n”组合爆炸;2. 抽象类(如shape)包含指向实现接口的指针或引用,调用具体实现(如drawingapi),使两者互不影响;3. 适用于多…

    2025年12月18日 用户投稿
    700

发表回复

登录后才能评论
关注微信