图文深入理解SQL语句的执行过程

  1. List item

    本文将深入介绍SQL语句的执行过程。
    一.在RDBMS(关系型DB)中,看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂,也就是说,你执行了一条诸如select count(*) where id = 001 from table_name的非常简单的语句,执行过程可能快的让你察觉不到耗时,但是就是这样一条简单的SQL语句,RDBMS在后台却为我们做了很多工作:过程如下两图所示
    在这里插入图片描述
    在这里插入图片描述
    二。在Oracle DB中,执行一条已经写入DB内存的SQL的流程如下两图(网图,谢过)所示:
    在这里插入图片描述
    在这里插入图片描述
    ‌①,将SQL语句加载入数据库缓冲区‌:首先,SQL语句被加载到数据库的缓冲区中,这是为了提高数据访问的速度和效率。
    ②,将SQL语句要操作的数据文件副本加载入数据库缓冲区‌:接下来,将要被操作的数据文件的副本也被加载到数据库缓冲区中,以便进行后续的修改操作。
    ‌③,执行SQL语句,修改数据文件副本,形成“脏缓冲区”‌:SQL语句被执行,对数据文件副本进行修改,这些被修改的数据文件副本被称为“脏缓冲区”,因为它们还未被写入到原始的数据文件中。
    ‌④,CKPT检测到“脏缓冲区”,调用DBWn‌:CKPT(Checkpoint)进程检测到“脏缓冲区”后,会调用DBWn(Database Writer)进程。
    ⑤,在DBWn运行之前,先运行LGWR,将数据文件的原始状态和数据库的改变记录到Redo Log Files‌:在DBWn运行之前,LGWR(Log Writer)进程先将数据文件的原始状态和数据库的改变记录到Redo Log Files中,这是为了确保在系统崩溃时能够恢复数据。
    ‌⑥,运行DBWn,将“脏缓冲区的内容写入到数据文件”‌:DBWn进程将“脏缓冲区”的内容写入到原始的数据文件中,完成数据的持久化存储。
    ‌⑦,同时CKPT修改控制文件和数据文件头‌:CKPT进程同时修改控制文件和数据文件头,以确保数据库的一致性和完整性。
    ⑧,SMON回收不必要的空闲资源‌:最后,SMON(System Monitor)进程回收不必要的空闲资源,以优化数据库的性能和效率。
    ⑨,如有符合的结果,则返回给users.

三.SQL执行过程中的几个重要阶段:
1.SQL解析阶段,主要介绍硬解析、软解析和软软解析
硬解析(Hard Parse)
当数据库接收到一条新的 SQL 语句时,如果该语句之前从未被执行过,数据库需要进行硬解析。硬解析的过程较为复杂和耗时,主要包括以下步骤:
1.语法分析:检查 SQL 语句的语法是否正确,确保关键字、表名、列名等的使用符合 SQL 规范。
2.语义检查:验证语句中涉及的对象(如表、视图、列等)是否存在,数据类型是否匹配,以及用户是否具有执行该语句的权限。
3.查询优化:数据库根据各种因素(如表的大小、索引的存在、数据的分布等)确定执行该 SQL 语句的最佳执行计划。这是一个复杂的过程,可能需要尝试多种执行方案并评估其成本。
4.生成执行代码:根据选定的执行计划,数据库生成可执行的代码。
硬解析需要消耗较多的数据库资源,尤其是 CPU 和内存。频繁的硬解析会严重影响数据库的性能。
软解析(Soft Parse)
如果数据库接收到一条 SQL 语句,并且该语句之前已经被执行过,并且在共享池中可以找到完全匹配的执行计划,那么数据库可以进行软解析。软解析的过程相对简单,主要包括以下步骤:
1.语法检查:快速检查 SQL 语句的语法是否正确。
2.确认执行计划:在共享池中查找与该 SQL 语句完全匹配的执行计划,并确认其仍然有效。如果执行3.计划可用,数据库可以直接使用它,无需进行查询优化。
软解析比硬解析快得多,因为它避免了查询优化的过程。软解析可以提高数据库的性能,特别是对于频繁执行的 SQL 语句。
软软解析(Soft Soft Parse)
软软解析也称为 “超快软解析” 或 “无锁软软解析”,是一种比软解析更高效的解析方式。在某些情况下,数据库可以在不获取任何锁的情况下进行软软解析,进一步减少了解析的开销。
软软解析通常发生在以下情况:
1.共享池中已经存在与当前 SQL 语句完全匹配的执行计划,并且该执行计划没有被其他会话修改或删除。
2.数据库可以直接使用该执行计划,无需进行任何额外的检查或锁定。软软解析的速度非常快,可以极大地提高数据库的性能,特别是在高并发环境下。
为了减少硬解析的次数,提高数据库性能,可以采取以下措施:
1.使用绑定变量:绑定变量可以使不同的 SQL 语句在共享池中共享执行计划,减少硬解析的发生。
2.优化 SQL 语句:确保 SQL 语句的编写高效、简洁,避免复杂的查询和不必要的操作。
3.调整数据库参数:合理调整数据库的参数,如共享池大小、游标共享等,以优化解析过程。

2.执行计划阶段做什么?
SQL 执行计划是数据库为执行特定 SQL 语句而选择的一系列步骤的描述。它详细说明了数据库将如何访问数据、进行连接操作、应用条件筛选等,以返回查询结果或执行数据修改操作。
执行计划的组成部分
1.操作步骤
执行计划由一系列操作组成,每个操作代表数据库执行的一个具体任务。常见的操作包括:
表扫描(Table Scan):数据库读取表中的数据行。可以是全表扫描(Full Table Scan),即读取表中的所有行,或者索引扫描(Index Scan),通过索引快速定位特定的行。
索引查找(Index Lookup):使用索引来查找满足条件的行。可以是唯一索引查找(Unique Index Lookup)或范围索引查找(Range Index Lookup)等。
连接操作(Join):将多个表中的数据行根据连接条件进行合并。常见的连接方式有嵌套循环连接(Nested Loops Join)、哈希连接(Hash Join)和排序合并连接(Sort Merge Join)等。
排序操作(Sort):对数据进行排序,例如在使用 ORDER BY 子句时。
聚合操作(Aggregation):执行聚合函数,如 SUM、AVG、COUNT 等。
2.操作顺序
执行计划中的操作按照特定的顺序执行。数据库根据查询的需求和数据的分布情况选择最佳的操作顺序,以最小化执行时间和资源消耗。例如,在连接操作中,数据库会选择合适的连接顺序,以减少中间结果集的大小。
3.操作成本
每个操作都有一个相关的成本估计。成本通常以数据库内部的单位(如 I/O 操作次数、CPU 时间等)来衡量。数据库在生成执行计划时,会尝试选择总成本最低的方案。成本估计基于数据库的统计信息,包括表的大小、索引的选择性、数据的分布等。
执行计划的生成过程
1.语法分析和语义检查
当数据库接收到 SQL 语句时,首先进行语法分析和语义检查,确保语句的正确性和合法性。
2.查询优化
数据库的查询优化器根据 SQL 语句和数据库的统计信息,生成多个可能的执行计划。优化器会考虑各种因素,如表的大小、索引的存在、数据的分布、连接方式等,以选择最优的执行计划。
3.成本评估
对于每个生成的执行计划,优化器会进行成本评估。成本评估基于数据库的统计信息和内部的成本模型。优化器会选择成本最低的执行计划作为最终的执行方案。
4.执行计划生成
一旦确定了最优的执行计划,数据库会生成相应的执行代码,并准备执行 SQL 语句。
查看执行计划的方法
1.EXPLAIN PLAN 语句
可以使用 EXPLAIN PLAN FOR 语句来查看 SQL 语句的执行计划。该语句会将执行计划存储在数据库的一个特定表中,可以通过查询该表来获取执行计划的详细信息。
2.SQL Developer 等工具
Oracle SQL Developer 等数据库开发工具提供了图形化的界面,可以方便地查看 SQL 语句的执行计划。这些工具通常会以树状图或表格的形式展示执行计划的各个步骤,以及相关的成本信息和统计数据。
了解 SQL 执行计划对于优化数据库性能非常重要。通过分析执行计划,可以确定 SQL 语句的执行效率,找出潜在的性能瓶颈,并采取相应的优化措施,如创建合适的索引、调整查询语句、优化数据库参数等。

码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB基本知识和排障案例及经验、性能调优等。

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

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

相关文章

[WMCTF2020]Make PHP Great Again 2.01

又是php代码审计,开始吧. 这不用审吧,啊喂. 意思就是我们要利用require_once()函数和传入的file的value去读取flag的内容.,貌似呢require_once()已经被用过一次了,直接读取还不行,看一下下面的知识点. require_once() require…

WebLogic 漏洞复现

1、后台弱⼝令GetShell 默认账号密码:weblogic/Oracle123 weblogic常⽤弱⼝令:https://cirt.net/passwords?criteriaweblogic 这⾥注意, 单个账号错误密码5次之后就会⾃动锁定。 http://47.121.212.195:7001/console 2、登录后台后&#…

恒生科指八连涨,汽车股强势

9月20日电 周五,港股三大股指集体收涨。恒生指数涨1.36%报18258.57点,连续第六个交易日上涨;恒生科技指数涨1.43%报3703.84点,连续第八个交易日上涨,创逾两个月来新高;恒生中国企业指数涨1.21%报6381.5点&a…

项目扩展五:交互式:command-line interface版本的实现

项目扩展五:command-line interface版本的实现 一、CLI交互的设计1.为何要设计这个CLI交互2.具体设计1.启动服务2.选择信道3.选择虚拟机4.正式业务注意:1.消费者与生产者跟信道的关系2.消息处理回调函数的问题3.消息确认的问题 5.其他功能1.打印功能2.查…

STM32精确控制步进电机

目的:学习使用STM32电机驱动器步进电机,进行电机运动精确控制。 测试环境: MCU主控芯片STM32F103RCT6 ;A4988步进电机驱动器模块;微型2相4线步进电机10mm丝杆滑台,金属丝杆安装有滑块。 10mm二相四线微型…

机器学习之非监督学习(二)异常检测(基于高斯概率密度)

机器学习之非监督学习(二)异常检测(基于高斯概率密度) 0. 文章传送1.案例引入2.高斯正态分布3.异常检测算法4.异常检测 vs 监督学习5.算法优化6.代码实现 0. 文章传送 机器学习之监督学习(一)线性回归、多…

C语言中数组和字符串的联系

一、C语言中,数组和字符串 1、C语言中,定义一个数组后,数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针,但是这个指针不能重新指向。2、字符串在C语言中是通过字符数组来实现的,也就是说字符串还是…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

Elasticsearch 完整格式的 URL 进行分词,有什么好的解决方案吗?

1、问题描述 我想对完整格式的 url 进行分词,请问有什么好的解决方案吗? 比如:https://www.abc.com/any/path?param_1some&param-2other#title 看了官方的分词器,感觉没啥合适的? 预处理的话,又不知道该怎么处理…

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好,代码也耦合度也低,但是我有个简单的写法同样能实现一样的效果,所以我就充分发挥了一下主观能动性 相较于基本功能,这一版做出了如下改动 1.限制了对象池最大数量,多出来的…

C++11 可变的模板参数

前言 本期我们接着继续介绍C11的新特性,本期我们介绍的这个新特性是很多人都感觉抽象的语法!它就是可变的模板参数! 目录 前言 一、可变的模板参数 1.1可变的参数列表 1.2可变的参数包 1.3可变参数包的解析 • 递归展开解析 • 逗号…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一:格式 docker rmi 要…

【解密 Kotlin 扩展函数】扩展函数的创建(十六)

导读大纲 1.1 为第三方的类添加方法: 扩展函数 1.1 为第三方的类添加方法: 扩展函数 Kotlin 的主题之一是与现有代码的平滑集成 即使是纯 Kotlin 项目,也是构建在 Java 库之上的 如 JDK、Android 框架和其他第三方框架 而当你将 Kotlin 集成到 Java 项目中时 你还要处理尚未或不…

python爬虫:将知乎专栏文章转为pdf

欢迎关注本人的知乎主页~ 实现思路 用户输入专栏ID: 代码首先提示用户输入一个知乎专栏的ID,默认值为 c_1747690982282477569。输入的ID用于构建API请求的URL。 发送HTTP请求: 使用 requests.get() 向知乎API发送GET请求,获取指定…

【QGIS入门实战精品教程】6.1:QGIS根据属性条件查询数据(SQL表达式)

文章目录 一、字段过滤二、高级过滤(表达式)一、字段过滤 对于单个字段的查询,可以采用字段过滤,例如,从县区数据中,根据NAME字段,查找出县级市玉门市。操作为:右键县区→打开属性表: 点击左下角,选择name字段。 输入玉门市,回车,选择查找除的属性表记录,此时图斑…

【Linux】入门【更详细,带实操】

Linux全套讲解系列,参考视频-B站韩顺平,本文的讲解更为详细 目录 1、课程内容 2、应用领域 3、概述 4、 Linux和Unix 5、VMware15.5和CentOS7.6安装 6、网络连接三种方式 7、虚拟机克隆 8、虚拟机快照 9、虚拟机迁移删除 10、vmtools 11、目录…

set-ExecutionPolicy RemoteSigned 提示不是内部或外部命令,也不是可运行的程序或批处理文件

这个错误一般发生在使用命令提示符或者PowerShell窗口中找不到set-ExecutionPolicy RemoteSigned。如果你想在命令提示符或者PowerShell窗口运行set-ExecutionPolicy RemoteSigned,你需要搜索打开Window PowerShell ISE,并以管理员身份打开,输…

基于微信小程序的美食外卖管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

Tomcat系列漏洞复现

CVE-2017-12615——Tomcat put⽅法任意⽂件写⼊漏洞 漏洞描述 当 Tomcat运⾏在Windows操作系统时,且启⽤了HTTP PUT请求⽅法(例如,将 readonly初始化参数由默认值设置为false),攻击者将有可能可通过精⼼构造的攻击请求…

身份安全风险不断上升:企业为何必须立即采取行动

在推动安全AI 模型的过程中,许多组织已转向差异隐私。但这种旨在保护用户数据的工具是否阻碍了创新? 开发人员面临一个艰难的选择:平衡数据隐私或优先考虑精确结果。差分隐私可以保护数据,但通常以牺牲准确性为代价——对于医疗保…