文章目录

  • 前言
  • 一、数据分页的五种性能分析
    • 1.ROW_NUMBER() OVER()方式
    • 2.offset fetch next方式
    • 3.top not in方式
    • 4.升序与降序方式
    • 5.采用MAX(ID)或者MIN(ID)函数方式

前言

数据分页往往有三种常用方案。

  • 把数据库中存放的相关数据,全部通过编程语言读入内存中,再由代码对其进行分页操作(速度慢,简易性高)。
  • 直接在数据库中对相关数据进行分页操作,再把分页后的数据输出给代码程序(速度中,简易性中)。
  • 先把数据库中的相关数据全部读入“缓存”或第三方工具,再由代码程序对“缓存”或第三方工具中的数据进行读取+分页操作(速度快,简易性差)。

本文主要是直接在数据库中对相关数据进行分页操作,数据库是SQL Server上的案例(其它种类数据库由于Sql语句略有差异,所以需要调整,但方案也类似)

一、数据分页的五种性能分析

1.ROW_NUMBER() OVER()方式

1、这种分页方案主要是在SQL2012以下推荐使用。

通用写法如下:

--pageIndex 表示指定页
--pageSize  表示每页显示的条数
SELECT * FROM(SELECT ROW_NUMBER() OVER(ORDER BY 排序字段) AS RowId,* FROM 表名 ) AS r
WHERE  RowId  BETWEEN ((pageIndex-1)*pageSize + 1) AND (pageIndex * PageSize)

用子查询新增一列行号(ROW_NUMBER)RowId查询,比较高效的查询方式,只有在SQL Server2005或更高版本才支持。

BETWEEN 1 AND 10 是指查询第1到第10条数据(闭区间),在这里面需要注意的是OVER的括号里面可以写多个排序字段。

2、代码案例

-- 1.数据库分页方案一  ROW_NUMBER() OVER()方式
SELECT * FROM(SELECT ROW_NUMBER() OVER(ORDER BY MO_ID) AS RowId,* FROM MO ) AS r
WHERE  RowId BETWEEN 1 AND 10

2.offset fetch next方式

1、这种分页方案主要是在SQL2012及以上的版本才支持:推荐使用

通用写法如下:

--pageIndex 表示指定页
--pageSize  表示每页显示的条数
SELECT * FROM 表名
ORDER BY 排序字段 offset ((pageIndex - 1) * pageSize) ROWS FETCH NEXT pageSize ROWS ONLY
  • offset 是跳过多少行,
  • next是取接下来的多少行,

句式 offset…rows fetch nect …rows only ,注意rows和末尾的only 不要写漏掉了,并且这种方式必须要接着Order by XX 使用,不然会报错。

2、代码案例

-- 2.数据库分页方案一  ROW_NUMBER() OVER()方式
SELECT * FROM MO
ORDER BY MO_ID offset 0 ROWS FETCH NEXT 10 ROWS ONLY

3.top not in方式

1、不推荐使用这种方式进行分页

通用写法如下:

--pageIndex 表示指定页
--pageSize  表示每页显示的条数
SELECT TOP pageSize *
FROM 表名
WHERE 主键字段 NOT IN (SELECT TOP ((pageSize-1)*pageIndex) 主键字段 FROM 表名)

这条语句的原理是先查询1-10条记录的ID,然后再查询ID不属于这1-10条记录的ID,并且只需要10条记录,因为每页大小就是10,这就是获取到的第11-20条记录,这是非常简单的一种写法。

另外IN语句与NOT IN语句类似,这是NOT IN的写法,但是这种写法数据量大的话效率太低。

2、代码案例

-- 2.数据库分页方案一  ROW_NUMBER() OVER()方式
SELECT TOP 10 *
FROM MO
WHERE MO_ID NOT IN (SELECT TOP 10 MO_ID FROM MO)

4.升序与降序方式

1、不推荐使用这种方式进行分页

通用写法如下:

--pageIndex 表示指定页
--pageSize  表示每页显示的条数
SELECT * FROM(SELECT TOP pageSize * FROM(SELECT TOP ((pageIndex - 1) * pageSize +(pageSize*2)) * FROM 表名 ORDER BY 排序字段 ASC) AS TEMP1 ORDER BY 排序字段 DESC)AS TEMP2 ORDER BY 排序字段 ASC

这条语句首先查询前20条记录,然后在倒序查询前10条记录(即倒数10条记录),这个时候就已经获取到了11-20条记录,但是他们的顺序是倒序,所以最后又进行升序排序。

2、代码案例

--4.查询第11-20条记录
SELECT * FROM(SELECT TOP 10 * FROM(SELECT TOP 20 * FROM MO ORDER BY MO_ID ASC) AS TEMP1 ORDER BY MO_ID DESC)AS TEMP2 ORDER BY MO_ID ASC

5.采用MAX(ID)或者MIN(ID)函数方式

1、不推荐使用这种方式进行分页

通用写法如下:

--pageIndex 表示指定页
--pageSize  表示每页显示的条数
SELECT TOP pageSize * FROM 表名 WHERE 排序字段>(SELECT MAX(menuId) FROM(SELECT TOP ((PageIndex-1)*PageSize) 排序字段 FROM 表名 ORDER BY 排序字段) AS TEMP1) --(第10条的id)

这个理解起来也简单,先把第10条记录的id找出来(当然这里面是直接使用MAX()进行查找,MIN()函数的用法也是类似的),然后再对比取比第10条记录的id大的前10条记录即为我们需要的结果。

2、代码案例

-- 5.查询第11-20条记录
SELECT TOP 10 * FROM MO WHERE MO_ID>(SELECT MAX(MO_ID) FROM(SELECT TOP 10 MO_ID FROM MO ORDER BY MO_ID) AS TEMP1) --(第10条的id)

【愚公系列】2022年01月 SQL Server数据库-数据分页的五种性能分析相关推荐

  1. Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档

    Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档 一.Debezium概述 二.SQL Server 连接器的工作原理 1.Snapshot ...

  2. 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构...

    有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下: 有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个By ...

  3. 【北亚数据恢复】通过碎片拼接技术恢复XenServer服务器磁盘中SQL Server数据库数据

    环境: Dell PowerEdge服务器: XenServer虚拟化平台: 4块希捷2T STAT硬盘用RAID卡组成的RAID10: XenServer虚拟机操作系统:Windows Server ...

  4. Sql Server数据库数据导入到SQLite数据库中

    背景:Sql Serve数据库中有个表格A,想把数据导入到SQLite数据库中 工具下载地址:点击打开链接 用法: 原作者地址及下载地址:点击打开链接

  5. hbase 导入mysql_HBase导入SQL Server数据库数据

    在先前的几篇随笔中已经介绍了Hadoop.Zookeeper.Hbase的分布式框架搭建方案,目前已经搭建完成了一个包含11个节点的分布式集群.而对于HBase数据库的使用仅限于测试性质的增删改查指令 ...

  6. 浪潮财务软件SQL SERVER数据库数据删除恢复成功

    [用户单位] 某企业 [数据恢复故障描述] 用户在进行数据维护时,误操作,在浪潮财务软件中把数据初始化了,因今年没有做备份,故今年所有财务凭证丢失. [数据恢复故障分析] 在SQL Server企业管 ...

  7. SQL Server数据库实操 第五波 完整性约束和触发器

    课上实训 3个表+16道题 police(pno警号,pid身份证号) pcase(cno案件编号,cname案件名称,ctype案件类型,cbrief案件简介) pc(pno警号,cno案件编号,p ...

  8. SQL Server 数据库修复专家SQLRescue

    专注于SQL Server数据库的恢复.专注于各种勒索病毒加密数据库的修复. SQLRescue可用于从损坏的 MS SQL Server 数据库数据文件(*.mdf  *.ndf 文件)中恢复数据. ...

  9. Sql server服务器数据备份到本地

    将服务器SQL server数据库数据备份到本地(遇到很多坑,最后备份成功) 先将服务器数据进行备份 我用的是将数据备份成bak文件,软件用的是Navicat Premium. 如下图所示,鼠标选中备 ...

最新文章

  1. 弱电工程光纤传输基础知识
  2. CentOS release 6.2 共享文件夹
  3. IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
  4. [route]Add up route for deb rpm and windows / 为RPM系DEB系和Windows添加路由
  5. 用汇编语言写的第一个DOS程序
  6. html异形轮播,异形滚动
  7. QQ正式上线QID功能 用户可自定义专属身份卡
  8. excel切片器显示错误_Office 2016中报表用户的新Excel切片器功能
  9. java调用matlab的jar包
  10. MacOS Big Sur 11.5.1 (20G80) OC 0.7.1 / Cl 5138 / PE 三分区原版黑苹果镜像
  11. python菜鸟教程w-【读书】Django教程(菜鸟教程)
  12. 清理C盘空间,无需命令行,可清理几十G内存,实测有效
  13. 写给冬天里开放的那些花儿
  14. 安卓模拟器错误: Could not open
  15. java.lang.NoClassDefFoundError: Could not initialize class找不类的问题
  16. Mac电脑用预览功能调整图像大小?Mac调整图片大小方法
  17. systemUI 学习记录1
  18. android加密参数定位方法
  19. Vue实现图形化积木式编程(一)
  20. java mission control_JVM系列九(虚拟机性能监控工具 - Java Mission Control).

热门文章

  1. 人脸识别时,一定要穿衣服!要不然……
  2. android平板专用系统,Chrome OS将取代Android成为平板专用系统
  3. PTA基础编程题目集7-8超速判断
  4. 巨蟹座|巨蟹座性格分析
  5. http://www.xueh188.top/index.php/archives/39/
  6. Python矩阵运算(不使用库)
  7. 2013计算机考试选择题,2013年大学计算机考试选择题练习(2)
  8. go配置解析库 - viper
  9. 成为优秀架构师的必备技能
  10. Oracle中Constraint的状态参数initially与deferrable