sql调优:优化响应时间(优化sql) ; 优化吞吐量

news2025/3/4 19:36:32

Sql性能调优的目的

1.优化响应时间>>优化sql

经过调优后,执行查询、更新等操作的时候,数据库的反应速度更快,花费的时间更少。

2.优化吞吐量

即“并发”, 就是“同时处理请求”的能力。

优化sql

尽量将多条SQL语句压缩到一句>>减少访问数据库的次数

SQL中每次执行SQL的时候都要建立网络连接、进行权限校验、进行SQL语句的查询优化、发送执行结果,这个过程是非常耗时的,因此应该尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句就不要用多条来执行。

使用表的别名

>>当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,就可以减少解析的时间并减少那些由列歧义引起的语法错误。

合理使用游标

>>游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写

>>使用WHILE循环代替游标,性能通常更好

>>MERGE语句可以同时处理插入、更新和删除操作,适合替代游标中的复杂逻辑

选择记录条数最少的表作为基础表(在FROM 子句中包含多个表的情况下)

 

TRUNCATE语句替代DELETE语句(清空表数据时)

>>当执行TRUNCATE命令时, 回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。因此很少资源被调用,整个执行时间就会很短。

 

通过用索引提高效率, 且避免导致索引失效的情况

>>避免SQL中出现隐式类型转换

(索引字段在作为where条件)因为隐式类型转换也属于计算,所以此时DBMS会使用全表扫面。

>>避免在索引列上使用空值判断,即 IS NULL和IS NOT NULL。

可能造成优化器假设匹配的记录数太多,检索范围过宽,DBMS优化器将放弃索引查找而使用全表扫描。

>>避免在索引列上使用NOT。

>>避免在索引列上使用函数

>>避免在索引上进行数学计算(+-*/)

>>用UNION替换OR(适用于索引列):

>>联合索引遵循最左原则:

如果索引是建立在多个列上,只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引。

>>避免改变索引列的类型:

当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换

假设 EMPNO是一个数值类型的索引列. SELECT … FROM EMP WHERE EMPNO = ‘123' 实际上,经过ORACLE类型转换, 语句转化为: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123') 幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.

假设EMP_TYPE是一个字符类型的索引列. SELECT … FROM EMP WHERE EMP_TYPE = 123 这个语句被ORACLE转换为: SELECT … FROM EMP WHERE TO_NUMBER(EMP_TYPE)=123 因为内部发生的类型转换, 这个索引将不会被用到!

 

Union

>>用UNION ALL替换UNION,(union all不去重,性能更好)

>>用UNION替换WHERE子句中的OR, 可以避免索引的失效

当WHERE子句中使用OR连接多个条件时,数据库优化器可能无法有效利用索引,从而导致全表扫描

通过将OR条件重写为UNION,可以将查询拆分为多个子查询,每个子查询独立利用索引EXISTS

 

EXISTS

>>当SQL包含一对多表查询时,用EXISTS替换DISTINCT

DISTINCT关键字用于去除查询结果中的重复行。它的实现方式通常是: 先执行查询,生成一个中间结果集。 然后对中间结果集进行排序或哈希操作,以去除重复行

短路评估:EXISTS子句在找到第一个匹配的记录后会立即停止搜索,不会继续处理剩余的记录。

 布尔逻辑:EXISTS返回布尔值(TRUE或FALSE),而不是具体的行数据,因此它避免了不必要的数据处理和去重操作

>>用EXISTS替代IN、用NOT EXISTS替代 NOT IN

  EXISTS和NOT EXISTS通过短路评估(找到第一个匹配项后停止搜索)提高了查询效率

 >= 替换 >

WHERE age > 25如果数据中存在大量等于25的记录,>=可能会更快地定位到起始点

在select中,避免*的使用

oracle在解析的过程中,会将“* ”依次转换成列名, 这是通过查询数据字典完成的, 这将耗费更长的时间。

简单等值比较使用DECODE函数, 复杂判断条件case when

DECODE语法简洁, 可以减少SQL解析的复杂度

短路评估:DECODE函数在找到匹配条件后会立即返回结果,而不会继续评估后续条件

在使用oracle时,尽量多使用COMMIT命令。 该命令可以明显释放运行资源,因此程序的性能得到明显提高。(太基础,本来就应该这么做,不建议说)

SQL语句尽量用大写的

因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。

尽量将HAVING中的条件放到where中.

减少数据处理量:将条件从HAVING移到WHERE可以尽早地过滤掉不满足条件的记录,从而减少后续数据处理的量。

避免不必要的聚合计算:如果条件可以放在WHERE子句中,可以避免对不满足条件的记录进行聚合计算,提高查询效率。

利用索引:WHERE子句中的条件可以利用索引进行快速过滤,而HAVING子句中的条件通常无法利用索引

使用参数化SQL,预编译查询

程序中通常是根据用户的输入来动态执行SQL,这时应该尽量使用参数化SQL,这样不仅可以避免SQL注入漏洞攻击,最重要数据库会对这些参数化SQL进行预编译,这样第一次执行的时候DBMS会为这个SQL语句进行查询优化并且执行预编译,这样以后再执行这个SQL的时候就直接使用预编译的结果,这样可以大大提高执行的速度。

提高"抗并发"能力的方法

降低事务隔离级别(一定程度地牺牲数据一致性等)>>数据分析系统(读多写少)

通过“集群”等方式,实现请求的“负载均衡”>>Hadoop

为什么降低隔离级别可以提高抗并发能力?

减少锁竞争:高隔离级别(如SERIALIZABLE)通常需要更严格的锁机制来保证数据一致性,这会导致事务之间频繁的锁竞争,降低并发性能。

减少锁等待时间:降低隔离级别可以减少锁的使用范围和持有时间,从而减少事务之间的等待时间,提高系统的吞吐量。

牺牲一致性换取性能:在某些业务场景中,数据一致性要求并不严格,可以通过适当降低隔离级别来换取更高的并发性能。

为什么集群可以提高抗并发能力?

负载均衡:通过将请求分散到多个数据库节点上,避免单个节点过载,从而提高系统的整体处理能力。

高可用性:集群中的节点可以相互备份,当某个节点出现故障时,其他节点可以接管其请求,保证系统的可用性。

扩展性:可以通过增加节点来水平扩展系统的处理能力,适应不断增长的业务需求。

 

适用场景:对并发性能和可用性要求较高的场景,例如

高流量的在线交易系统:如电商平台、金融系统等,需要处理大量并发请求。

分布式大数据系统:如Hadoop、Cassandra等,通过分布式架构处理海量数据。

 

数据库集群是指通过多台数据库服务器(DB Server)协同工作,共同承担业务请求的系统。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2020最新Java面试题

2020最新Java面试题 序Java基础JVMRedis 序 研发了这么多年,每天都在搬砖,斗转星移,从一个被面试者,成为了一个面试者。总感觉自己在面试的时候提出的问题没有一个由浅入深的感觉,总是东一个问题,西一个…

批量设置 Word 样式,如字体信息、段落距离、行距、页边距等信息

在 Word 文档中,我们可以做各种样式的处理。比如设置 Word 文档的字体样式、设置 Word 文档的段落样式以及设置 Word 文档的页面样式。我们通常可以在 Office 中完成这些操作,相信绝大部分场景我们也是这样完成的。但是如果我们手上有 1000 个 Word 文档…

win本地vscode通过代理远程链接linux服务器

时间:2025.2.28 1. win本地下载nmap.exe nmap官网 https://nmap.org/或者 https://nmap.org/download#windows下载win版本并安装。 2. vscode插件Remote-SSH 插件下载Remote-SSH 3. 配置 按照图中顺序配置ssh 1.点击左侧工具栏的“小电视”图标 2.点击ssh的…

EVOAGENT: Towards Automatic Multi-Agent Generation via Evolutionary Algorithms

题目 EVOAGENT:通过进化算法实现多智能体自动生成 论文地址:https://openreview.net/pdf?id05bBTmRj9s 项目地址:https://evo-agent.github.io/ 摘要 强大的大型语言模型(LLM)的出现激发了一种新的趋势,即构建基于LLM的自治代理来解决复杂的…

Linux虚拟机网络配置-桥接网络配置

简介 本文档旨在指导用户如何在虚拟环境中配置Linux系统的桥接网络,以实现虚拟机与物理主机以及外部网络的直接通信。桥接网络允许虚拟机如同一台独立的物理机一样直接连接到物理网络,从而可以被分配一个独立的IP地址,并能够与网络中的其他设…

【UI设计——视频播放界面分享】

视频播放界面设计分享 在本次设计分享中,带来一个视频播放界面的设计作品。 此界面采用了简洁直观的布局。顶部是导航栏,包含主页、播放、搜索框等常见功能,方便用户快速找到所需操作。搜索框旁输入 “萌宠成长记”,体现了对特定内…

SyntaxError: positional argument follows keyword argument

命令行里面日常练手爬虫不注意遇到的问题,报错说参数位置不正确 修改代码后,运行如下图: 结果: 希望各位也能顺利解决问题,祝你好运!

使用vue3+element plus 的table自制的穿梭框(支持多列数据)

目录 一、效果图 二、介绍 三、代码区 一、效果图 话不多说,先上图 二、介绍 项目需要:通过穿梭框选择人员信息,可以根据部门、岗位进行筛选,需要显示多列(不光显示姓名,还包括人员的一些基础信息&…

Java【多线程】(2)线程属性与线程安全

目录 1.前言 2.正文 2.1线程的进阶实现 2.2线程的核心属性 2.3线程安全 2.3.1线程安全问题的原因 2.3.2加锁和互斥 2.3.3可重入(如何自己实现可重入锁) 2.4.4死锁(三种情况) 2.4.4.1第一种情况 2.4.4.2第二种情况 2.4…

vue These dependencies were not found

These dependencies were not found: * vxe-table in ./src/main.js * vxe-table/lib/style.css in ./src/main.js To install them, you can run: npm install --save vxe-table vxe-table/lib/style.css 解决: nodejs执行以下语句 npm install --save vxe-t…

Yak 在 AI 浪潮中应该如何存活?

MCP 是 Claude 发起的一个协议,在2024年10月左右发布,在2025年2月开始逐步有大批量的 AI 应用体开始支持这个协议。这个协议目的是让 AI 同时可以感知有什么工具可以用,如果要调用这些工具的话,应该是用什么样的方式。 这个 MCP 协…

AI是否能真正理解人类情感?从语音助手到情感机器人

引言:AI与情感的交集 在过去的几十年里,人工智能(AI)的发展速度令人惊叹,从简单的语音识别到如今的深度学习和情感计算,AI已经深入到我们生活的方方面面。尤其是在语音助手和情感机器人领域,AI不…

大语言模型学习--本地部署DeepSeek

本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…

linux上面安装 向量数据库 mlivus和 可视化面板Attu

1. 确保docker(docker 19.0以上即可) 和 docker-compose(V2.2.2以上) 都已安装 2. 创建milvus工作目录 # 新建一个名为milvus的目录用于存放数据 目录名称可以自定义 mkdir milvus# 进入到新建的目录 cd milvus 3. 下载并编辑docker-compose.yml 在下载…

用工厂函数简化redis配置

工厂函数(Factory Function)不同于构造函数,工厂函数就是一个普通函数,通常用于创建对象或实例。它的核心思想是通过一个函数来封装对象的创建逻辑,而不是直接使用类的构造函数。工厂函数可以根据输入参数动态地决定创…

类和对象-继承-C++

1.定义 面向对象的三大特征之一&#xff0c;为了减少重复的代码 2.语法 class 子类 &#xff1a;继承方式 父类 &#xff08;子类也叫派生类&#xff0c;父类也称为基类&#xff09; 例&#xff1a;class age&#xff1a;public person&#xff1b; #include<iostrea…

使用Maven搭建Spring Boot框架

文章目录 前言1.环境准备2.创建SpringBoot项目3.配置Maven3.1 pom.xml文件3.2 添加其他依赖 4. 编写代码4.1 启动类4.2 控制器4.3 配置文件 5.运行项目6.打包与部署6.1 打包6.2 运行JAR文件 7.总结 前言 Spring Boot 是一个用于快速构建 Spring 应用程序的框架&#xff0c;它简…

RockyLinux 为 k8s 集群做准备

1.准备VM 镜像 开启虚拟机 选择安装 Rocky linux 9.5 软件选择最小安装就可以了 在 rocky 9 以后版本中 他全部 采用 network manager 去替换老的 network 去实现网络的管理 1.网卡配置 cat /etc/NetworkManager/system-connections/ens160.nmconnection 我们配置了两块网…

二十三种设计模式

2 工厂方法模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通…

SqlSugar 语法糖推荐方式

//方式1&#xff1a;var dd _repository._Db.Queryable<ConfigAggregateRoot, UserRoleEntity>((o, p) > o.Id p.Id).Select((o, p) > new{o.Id,o.Remark,p.RoleId,});//方式2&#xff1a;不推荐使用&#xff0c;建议优先使用 Lambda 表达式&#xff0c;因为它更…