sql server中千万数量级分页存储过程代码

分页是 Web 应用中常见的功能.当数据表中拥有千万条记录时,需要进行分页查询时,直接使用基础的分页查询语句可能会导致较高的性能消耗和响应延迟.因此需要使用分页存储过程来提高查询性能.

以下是 sql server 中 千万数量级分页存储过程代码的完整攻略:

  1. 分页查询的数据表

该数据表中共有 10000000 条记录,将其命名为test表.其中,主键为id,需要进行分页的条件为state=1.

  1. 定义存储过程

定义名为p_Page的存储过程,传入参数为 @pageIndex, @pageSize,@pageCount.

示例:

CREATE PROCEDURE [dbo].[p_Page]
   @pageIndex INT,  --页码
   @pageSize INT, --每页数据条数
   @pageCount INT OUT --总页数
AS

SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowID, * INTO #temptable FROM  test WHERE state=1

SET @pageCount = CEILING((SELECT COUNT(*) FROM #temptable) / CAST(@pageSize AS DECIMAL(16,2)))  --总页数

SELECT * FROM #temptable WHERE RowID BETWEEN ( (@pageIndex - 1) * @pageSize + 1 ) AND ( @pageIndex * @pageSize )

DROP TABLE #temptable
  1. 存储过程代码解析

a. 使用 SELECT INTO #temptable 创建临时表。

此步骤将test表中state=1的所有记录按照id排序,进行分页查询的结果保存到#temptable临时表中.

b. 使用ROW_NUMBER() OVER (ORDER BY id) AS RowID将当前行转换为数字.

ROW_NUMBER()在 SQL Server 中用来为查询结果集的每一行来赋一个行号,而使用 OVER 子句总是跟着一个 ORDER BY 子句,以确定如何为分配行号。本例中根据id进行排序.

c. 根据每页数据条数计算总页数。

在计算总页数时需要使用 CEILING() 函数和 CAST( ) 函数. 在 #temptable 临时表中的记录总数除以每页数据条数,并将结果转换为 decimal(16,2) 类型,然后使用 CEILING()函数将结果向上舍入得到总页数.

d. 使用 BETWEEN 运算符查询预期范围的记录.

在这里,可以使用 BETWEEN 运算符查询 ROW_NUMBER 列的值在页内的范围之间的记录. 具体地,计算起始行和结束行,然后查询两列之间的所有行.

e. 清空临时表。

使用DROP TABLE 语句清空#temptable表.

  1. 测试存储过程
DECLARE @pageCount INT

EXEC [dbo].[p_Page] @pageIndex=1, @pageSize=10, @pageCount=@pageCount OUTPUT

SELECT * FROM #temptable

SELECT @pageCount

预期结果如下:

  • 显示第一页的第1-10条数据
  • 输出总页数

注意,在运行以上的示例代码之前,请确保临时表已经被删除. 否则,可能会得到以下错误消息:“There is already an object named '#temptable' in the database.”.

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:sql server中千万数量级分页存储过程代码 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • centos安装redis,设置后台进程运行redis或者开机启动

    一、安装redis 第一步:下载redis安装包 http://download.redis.io/releases/redis-4.0.6.tar.gz   第二步:解压压缩包 tar -zxvf redis-4.0.6.tar.gz [root@iZwz991stxdwj560bfmadtZ local]# tar -zxvf redis-4.0.6.t…

    Redis 2023年4月11日
    00
  • sql语句优化之SQL Server(详细整理)

    下面我将详细讲解SQL语句优化之SQL Server攻略: 1. 优化查询的SELECT语句 1.1 确保查询只返回需要的列 查询语句中必须只获取需要的列,而不是所有的列。我们可以使用SELECT语句中的字段列表来指定需要返回的列,而不是使用”*”来返回表中的所有列。这样可以减少查询中传输的数据量,从而提高查询速度。 示例: — 错误: SELECT * …

    database 2023年5月19日
    00
  • 使用PHP+Redis实现延迟任务,实现自动取消订单功能

    使用PHP+Redis实现延迟任务,可以通过Redis中的有序集合(sorted set)以及Redis的一些命令来完成。 首先,我们需要在Redis中创建一个有序集合用于存放需要执行的任务,并在任务中设置延时时间。当任务到达指定的延迟时间后,我们可以通过Redis的命令进行处理。 在PHP代码中,可以使用Predis等Redis操作库通过以下步骤完成该功能…

    database 2023年5月22日
    00
  • MySQL慢SQL语句常见诱因以及解决方法

    MySQL慢SQL语句常见诱因以及解决方法 MySQL慢查询是指查询时间超出了设定的阈值,可能会影响系统的性能,甚至影响系统的正常使用。本文将会介绍MySQL慢查询的常见诱因以及相应的解决方法。 常见诱因 缺少合适的索引 缺少合适的索引是产生慢查询的最常见的原因之一。当MySQL执行一条查询语句时,如果没有合适的索引,那么就需要在表中扫描所有符合条件的行。就…

    database 2023年5月19日
    00
  • ORACLE中如何找到未提交事务的SQL语句详解

    要找到Oracle中未提交的事务的SQL语句,你需要执行以下步骤: 1. 查看当前正在进行的事务 使用以下SQL查询当前正在进行的事务,以查看是否有未提交的事务: SELECT s.inst_id, s.sid, s.serial#, s.status, s.username, s.osuser, s.machine, s.program, s.module…

    database 2023年5月21日
    00
  • spring boot集成redisson的最佳实践示例

    针对“spring boot集成redisson的最佳实践示例”的完整攻略,我将按照以下步骤进行讲解: 导入Redisson依赖 配置Redisson连接信息 编写基本的Redisson工具类 使用Redisson进行操作 示例说明1:基于Redisson的分布式锁实现 示例说明2:基于Redisson的分布式限流实现 接下来将分别进行讲解。 1. 导入Re…

    database 2023年5月22日
    00
  • VMware中Linux共享mysql数据库的方法

    下面是详细讲解”VMware中Linux共享mysql数据库的方法”的完整攻略: 1. 准备工作 首先,在VMWare中创建两个虚拟机,一个虚拟机用来运行Linux系统,另一个虚拟机用来运行MySQL数据库。确保两个虚拟机均能正常运行,并且互相能够ping通。 2. 在Linux系统中安装MySQL客户端 首先需要登录到Linux系统中,并在命令行中使用以下…

    database 2023年5月22日
    00
  • 详细深入聊一聊Mysql中的int(1)和int(11)

    当我们在设计MySQL表时,常常会使用int类型作为列的数据类型,但是int还可以指定长度,比如int(1)和int(11)两种类型。在这里,我们来深入聊一聊它们之间的不同。 int(1)与int(11)的区别 事实上,int(1)和int(11)在存储数据时并没有真正的差异,它们都占据四个字节的存储空间,存储的范围也一样。它们的唯一区别在于,int(1)在…

    database 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部