热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【愚公系列】2022年01月SQLServer数据库数据分页的五种性能分析

文章目录前言一、数据分页的五种性能分析1.ROW_NUMBER()OVER()方式2.offsetfetchnext方式3.topnotin方式4.升序与降序方式5.采用MAX(I

文章目录

  • 前言
  • 一、数据分页的五种性能分析
    • 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)

在这里插入图片描述


推荐阅读
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • importpymysql#一、直接连接mysql数据库'''coonpymysql.connect(host'192.168.*.*',u ... [详细]
  • 本文总结了在SQL Server数据库中编写和优化存储过程的经验和技巧,旨在帮助数据库开发人员提升存储过程的性能和可维护性。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在处理数据库中所有用户表的彻底清除时,目前尚未发现单一命令能够实现这一目标。因此,需要采用一种较为繁琐的方法来逐个删除相关表及其结构。具体操作可以通过编写PL/SQL脚本来实现,该脚本将动态生成并执行删除表的SQL语句。尽管这种方法相对复杂,但在缺乏更简便手段的情况下,仍是一种有效的解决方案。未来或许可以通过数据库管理工具或更高版本的数据库系统提供更简洁的处理方式。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在当今的软件开发领域,分布式技术已成为程序员不可或缺的核心技能之一,尤其在面试中更是考察的重点。无论是小微企业还是大型企业,掌握分布式技术对于提升工作效率和解决实际问题都至关重要。本周的Java架构师实战训练营中,我们深入探讨了Kafka这一高效的分布式消息系统,它不仅支持发布订阅模式,还能在高并发场景下保持高性能和高可靠性。通过实际案例和代码演练,学员们对Kafka的应用有了更加深刻的理解。 ... [详细]
  • 在将Excel数据导入MySQL数据库的过程中,如何确保不会生成重复记录?本文介绍了一种方法,通过PHP脚本检查数据库中是否存在相同的“Code”字段值,从而避免重复记录的产生。该方法不仅提高了数据导入的准确性,还增强了系统的健壮性。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
author-avatar
手浪用户2602924633
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有