【愚公系列】2022年01月 SQL Server数据库-数据分页的五种性能分析
文章目录
- 前言
- 一、数据分页的五种性能分析
- 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数据库-数据分页的五种性能分析相关推荐
- Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档
Debezium系列之:使用Debezium接入SQL Server数据库数据到Kafka集群的详细技术文档 一.Debezium概述 二.SQL Server 连接器的工作原理 1.Snapshot ...
- 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构...
有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下: 有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个By ...
- 【北亚数据恢复】通过碎片拼接技术恢复XenServer服务器磁盘中SQL Server数据库数据
环境: Dell PowerEdge服务器: XenServer虚拟化平台: 4块希捷2T STAT硬盘用RAID卡组成的RAID10: XenServer虚拟机操作系统:Windows Server ...
- Sql Server数据库数据导入到SQLite数据库中
背景:Sql Serve数据库中有个表格A,想把数据导入到SQLite数据库中 工具下载地址:点击打开链接 用法: 原作者地址及下载地址:点击打开链接
- hbase 导入mysql_HBase导入SQL Server数据库数据
在先前的几篇随笔中已经介绍了Hadoop.Zookeeper.Hbase的分布式框架搭建方案,目前已经搭建完成了一个包含11个节点的分布式集群.而对于HBase数据库的使用仅限于测试性质的增删改查指令 ...
- 浪潮财务软件SQL SERVER数据库数据删除恢复成功
[用户单位] 某企业 [数据恢复故障描述] 用户在进行数据维护时,误操作,在浪潮财务软件中把数据初始化了,因今年没有做备份,故今年所有财务凭证丢失. [数据恢复故障分析] 在SQL Server企业管 ...
- SQL Server数据库实操 第五波 完整性约束和触发器
课上实训 3个表+16道题 police(pno警号,pid身份证号) pcase(cno案件编号,cname案件名称,ctype案件类型,cbrief案件简介) pc(pno警号,cno案件编号,p ...
- SQL Server 数据库修复专家SQLRescue
专注于SQL Server数据库的恢复.专注于各种勒索病毒加密数据库的修复. SQLRescue可用于从损坏的 MS SQL Server 数据库数据文件(*.mdf *.ndf 文件)中恢复数据. ...
- Sql server服务器数据备份到本地
将服务器SQL server数据库数据备份到本地(遇到很多坑,最后备份成功) 先将服务器数据进行备份 我用的是将数据备份成bak文件,软件用的是Navicat Premium. 如下图所示,鼠标选中备 ...
最新文章
- 弱电工程光纤传输基础知识
- CentOS release 6.2 共享文件夹
- IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
- [route]Add up route for deb rpm and windows / 为RPM系DEB系和Windows添加路由
- 用汇编语言写的第一个DOS程序
- html异形轮播,异形滚动
- QQ正式上线QID功能 用户可自定义专属身份卡
- excel切片器显示错误_Office 2016中报表用户的新Excel切片器功能
- java调用matlab的jar包
- MacOS Big Sur 11.5.1 (20G80) OC 0.7.1 / Cl 5138 / PE 三分区原版黑苹果镜像
- python菜鸟教程w-【读书】Django教程(菜鸟教程)
- 清理C盘空间,无需命令行,可清理几十G内存,实测有效
- 写给冬天里开放的那些花儿
- 安卓模拟器错误: Could not open
- java.lang.NoClassDefFoundError: Could not initialize class找不类的问题
- Mac电脑用预览功能调整图像大小?Mac调整图片大小方法
- systemUI 学习记录1
- android加密参数定位方法
- Vue实现图形化积木式编程(一)
- java mission control_JVM系列九(虚拟机性能监控工具 - Java Mission Control).
热门文章
- 人脸识别时,一定要穿衣服!要不然……
- android平板专用系统,Chrome OS将取代Android成为平板专用系统
- PTA基础编程题目集7-8超速判断
- 巨蟹座|巨蟹座性格分析
- http://www.xueh188.top/index.php/archives/39/
- Python矩阵运算(不使用库)
- 2013计算机考试选择题,2013年大学计算机考试选择题练习(2)
- go配置解析库 - viper
- 成为优秀架构师的必备技能
- Oracle中Constraint的状态参数initially与deferrable