SQL执行过程详解

news2024/11/14 21:50:59

1 、用户在客户端执行 SQL 语句时,客户端把这条 SQL 语句发送给服务端,服务端的进程,会处理这条客户端的SQL语句。

2 、服务端进程收集到SQL信息后,会在进程全局区PGA 中分配所需内存,存储相关的登录信息等。

3 、客户端把 SQL 语句传送到服务器后,服务器进程会对该语句进行解析。这个解析的工作是在服务器端所进行的,解析过程又可细化。

在这里插入图片描述

(1 )查询高速缓存

服务器进程在接到客户端传送过来的 SQL 语句时,不会直接去数据库查询。服务器进程把这个 SQL 语句的字符转化为 ASCII 等效数字码,接着这个 ASCII 码被传递给一个 HASH 函数,并返回一个 hash 值,然后服务器进程将到 共享池shared pool 中的 高速缓存中去查找是否存在相同的 hash 值。如果存在,服务器进程将使用这条语句已高速缓存在 共享池shared pool 的 高速缓存中的已分析过的版本来执行,这就是是软解析。如果高速缓存中不存在,则需要进行上图后面的步骤,这就是硬解析。硬解析通常占整个 SQL 执行的 60% 左右的时间,硬解析会生成执行树,执行计划,等等。所以,采用高速数据缓存可以提高 SQL 语句的查询效率。主要是因为:一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高很多,另一方面也是因为避免语句解析而节省大量时间。

(2)语法检查

当在高速缓存中找不到对应的 SQL 语句时,则服务器进程就会开始检查这条语句的合法性。这里主要是对 SQL 语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条 SQL 语句不符合语法规则的时候,就会把这个错误信息反馈给客户端。在这个语法检查的过程中,不会对 SQL 语句中所包含的表名、列名等等进行检查,只是检查语法。

(3)语义检查

如果SQL 语句符合语法上的定义的话,则服务器进程接下去会对语句中涉及的表、索引、视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,看看这些字段、表、视图等是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。

(4)获得对象解析锁

为了保证数据的一致性,防止我们在查询的过程中,其他用户修改这个对象。系统就会对我们需要查询的对象加锁。

(5)数据访问权限确认

当语法、语义通过检查之后,客户端还不一定能够取得数据,服务器进程还会检查连接用户是否有这个数据访问的权限。若用户不具有数据访问权限的话,则客户端就不能够取得这些数据。要注意的是数据库服务器进程先检查语法与语义,然后才会检查访问权限。

(6)生成最优执行计划

当语法、语义、权限检测等都通过,服务器进程会根据一定的规则(如基于成本),对这条语句进行优化。最终确定可能的最低成本的执行计划。

4 、绑定变量赋值

如果 SQL 语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值,将变量值带入执行计划。

5 、语句执行

语句解析只是对 SQL 语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条 SQL 语句。

(1)对于 SELECT 语句:

第一、首先服务器进程要判断所需数据是否在 db buffer 存在,如果存在且可用,则直接获取

第二、若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中( buffer cache )。

(2)对于 insert 、 delete 、 update 语句:

第一、检查所需的数据是否已经被读取到缓冲区缓存中。如果已经存在缓冲区缓存,则直接执行步骤

A 若所需的数据并不在缓冲区缓存中,则服务器将数据块从数据文件读取到缓冲区缓存中;

B 对想要修改的表取得的数据行锁定,之后对所需要修改的数据行取得独占锁;

C 将数据的 Redo 记录复制到 redo log buffer ;

D 产生数据修改的 undo 数据;

E 修改 db buffer ;

F dbwr 将修改写入数据文件;

第二、服务器将数据从数据文件读取到 db buffer 要通过以下步骤:

A 首先服务器进程将在表头部请求 TM 锁(保证此事务执行过程其他用户不能修改表的结构),如果成功加 TM 锁,再请求一些行级锁( TX 锁),如果 TM 、 TX 锁都成功加锁,那么才开始从数据文件读数据。

B 在读数据之前,要先为读取的文件准备好 buffer 空间。服务器进程需要扫描 LRU list 寻找 free db buffer ,扫描的过程中,服务器进程会把发现的所有已经被修改过的 db buffer 注册到 dirty list 中。如果 free db buffer 及非脏数据块缓冲区不足时,会触发 dbwr 将 dirty buffer 中指向的缓冲块写入数据文件,并且清洗掉这些缓冲区来腾出空间缓冲新读入的数据。

C 找到了足够的空闲 buffer ,服务器进程将从数据文件中读入这些行所在的每一个数据块( db block )( DB BLOCK 是 ORACLE 的最小操作单元,即使你想要的数据只是 DB BLOCK 中很多行中的一行或几行, ORACLE 也会把这个 DB BLOCK 中的所有行都读入 Oracle DB BUFFER 中)放入 db buffer 的空闲的区域或者覆盖已被挤出 LRU list 的非脏数据块缓冲区,并且排列在 LRU 列表的头部,也就是在数据块放入 db buffer 之前也是要先申请 db buffer 中的锁存器,成功加锁后,才能读数据到 db buffer 。若数据块已经存在于 db buffer cache (有时也称 db buffer 或 db cache ),即使在 db buffer 中找到一个没有事务,而且 SCN 比自己小的非脏缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功才能进行后续动作,如果不成功,则要等待前面的进程解锁后才能进行动作(这个时候阻塞是 tx 锁阻塞)。

第三、记录 redo 日志

A 数据被读入到 db buffer 后,服务器进程将该语句所影响的并被读入 db buffer 中的这些行数据的 rowid 及要更新的原值和新值及 scn 等信息从 PGA 逐条的写入 redo log buffer 中。在写入 redo log buffer 之前也要事先请求 redo log buffer 的锁存器,成功加锁后才开始写入。

B 当写入达到 redo log buffer 大小的三分之一或写入量达到 1M 或超过三秒后或发生检查点时或者 dbwr 之前发生,都会触发 lgwr 进程把 redo log buffer 的数据写入磁盘上的 redo file 文件中(这个时候会产生 log file sync 等待事件)。

C 已经被写入 redo file 的 redo log buffer 所持有的锁存器会被释放,并可被后来的写入信息覆盖, redo log buffer 是循环使用的。 Redo file 也是循环使用的,当一个 redo file 写满后, lgwr 进程会自动切换到下一 redo file (这个时候可能出现 log file switch ( check point complete )等待事件)。如果是归档模式,归档进程还要将前一个写满的 redo file 文件的内容写到归档日志文件中(这个时候可能出现 log file switch ( archiving needed )。

第四、为事务建立 undo 信息

A 在完成本事务所有相关的 redo log buffer 之后,服务器进程开始改写这个 db buffer 的块头部事务列表并写入 scn (一开始 scn 是写在 redo log buffer 中的,并未写在 db buffer )。

B 然后 copy 包含这个块的头部事务列表及 scn 信息的数据副本放入回滚段中,将这时回滚段中的信息称为数据块的“前映像”,这个“前映像”用于以后的回滚、恢复和一致性读。(回滚段可以存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它表空间中的数据文件中开辟)。

第五|、修改信息写入数据文件

A 改写 db buffer 块的数据内容,并在块的头部写入回滚段的地址。

B 将 db buffer 指针放入 dirty list 。如果一个行数据多次 update 而未 commit ,则在回滚段中将会有多个“前映像”,除了第一个“前映像”含有 scn 信息外,其他每个 " 前映像 " 的头部都有 scn 信息和 " 前前映像 " 回滚段地址。一个 update 只对应一个 scn ,然后服务器进程将在 dirty list 中建立一条指向此 db buffer 块的指针(方便 dbwr 进程可以找到 dirty list 的 db buffer 数据块并写入数据文件中)。接着服务器进程会从数据文件中继续读入第二个数据块,重复前一数据块的动作,数据块的读入、记日志、建立回滚段、修改数据块、放入 dirty list 。

C 当 dirty queue 的长度达到阀值(一般是 25% ),服务器进程将通知 dbwr 把脏数据写出,就是释放 db buffer 上的锁存器,腾出更多的 free db buffer 。前面一直都是在说明 oracle 一次读一个数据块,其实 oracle 可以一次读入多个数据块( db_file_multiblock_read_count 来设置一次读入块的个数)

第六、当执行 commit

1 ) commit 触发 lgwr 进程,但不强制 dbwr 立即释放所有相应 db buffer 块的锁。也就是说有可能虽然已经 commit 了,但在随后的一段时间内 dbwr 还在写这条 sql 语句所涉及的数据块。表头部的行锁并不在 commit 之后立即释放,而是要等 dbwr 进程完成之后才释放,这就可能会出现一个用户请求另一用户已经 commit 的资源不成功的现象。

2 )从 Commit 和 dbwr 进程结束之间的时间很短,如果恰巧在 commit 之后, dbwr 未结束之前断电,因为 commit 之后的数据已经属于数据文件的内容,但这部分文件没有完全写入到数据文件中。所以需要前滚。由于 commit 已经触发 lgwr ,这些所有未来得及写入数据文件的更改会在实例重启后,由 smon 进程根据重做日志文件来前滚,完成之前 commit 未完成的工作(即把更改写入数据文件)。

3 )如果未 commit 就断电了,因为数据已经在 db buffer 更改了,没有 commit ,说明这部分数据不属于数据文件。由于 dbwr 之前触发 lgwr 也就是只要数据更改,(肯定要先有 log )所有 dbwr 在数据文件上的修改都会被先一步记入重做日志文件,实例重启后, SMON 进程再根据重做日志文件来回滚。

其实 smon 的前滚回滚是根据检查点来完成的,当一个全部检查点发生的时候,首先让 LGWR 进程将 redologbuffer 中的所有缓冲(包含未提交的重做信息)写入重做日志文件,然后让 dbwr 进程将 dbbuffer 已提交的缓冲写入数据文件(不强制写未提交的)。然后更新控制文件和数据文件头部的 SCN ,表明当前数据库是一致的,在相邻的两个检查点之间有很多事务,有提交和未提交的。

第七、如果执行 rollback

服务器进程会根据数据文件块和 db buffer 中块的头部的事务列表和 SCN 以及回滚段地址找到回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个”前映像“,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的一个“前映像”为止。一旦发出了 commit ,用户就不能 rollback ,这使得 commit 后 dbwr 进程还没有全部完成的后续动作得到了保障。

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

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

相关文章

国外SEO策略指南:确保你的网站排名第一!

如果你想在谷歌等搜索引擎中获得更高的排名并吸引更多的流量和潜在客户,那么你需要了解一些国外SEO策略。 下面是一些可以帮助你提高谷歌排名的关键策略。 网站结构和内容优化 谷歌的搜索算法会考虑网站的结构和内容。 因此,你需要优化网站结构&…

2379. 得到 K 个黑块的最少涂色次数

2379. 得到 K 个黑块的最少涂色次数 难度简单 给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 W 要么是 B ,表示第 i 块的颜色。字符 W 和 B 分别表示白色和黑色。 给你一个整数 k ,表示想要 连续 黑色块的数目。 每一…

Python数据结构与算法篇(二)-- 数组常见题型与解题技巧

数组和链表代表着计算机最基本的两种存储形式:顺序存储和链式存储,所以他俩可以算是最基本的数据结构。数组是一种基础数据结构,可以用来处理常见的排序和二分搜索问题,典型的处理技巧包括对双指针、滑动窗口等,数组是…

想要将多个视频拼接在一起?如何把三个视频合成一个视频

从事短视频创作行业以来,总是存在着各种挑战。最开始,因为主要负责视频素材的搜集,所以每天虽忙但充实,最近逐步开始学习视频的剪辑工作,可把我难到了!想要将多个视频拼接在一起?如何把三个视频…

「 Java 8 新特性 」Stream 中的 map、peek、foreach 方法的区别

「 Java 8 新特性 」Stream 中的 map、peek、foreach 方法的区别 文章参考: 面试官问:Stream 中的 map、peek、foreach 方法的区别?傻傻分不清楚。。 stream中的map,peek,foreach的区别 一、概述 在学习java 8的stream api时,我们…

Java【数据结构入门OJ题33道】——力扣刷题记录1

文章目录第一天存在重复元素最大子数组和第二天两数之和合并两个有序数组第三天两个数组的交集买卖股票最佳时机第四天重塑矩阵杨辉三角第五天有效的数独矩阵置零第六天字符串中第一个唯一字符救赎金第七天判断链表是否有环合并两个有序链表移除链表元素第八天反转链表删除重复…

c++面试技巧-高级应用篇

1.面试官:什么是文件流? 应聘者:写入文件或者从文件读出的数据流称之为文件流。 2.面试官:文件流的类时如何划分的? 应聘者:当C对文件进行处理时,需要包括头文件iostream和fstream。fstream头…

游戏逆向之游戏技能分析

角色的当前技能列表往往都是从系统的技能库中进行筛选而组成的,而这个筛选的过程大多非常的复杂,经过的代码和临时结构体的传递也非常的多,所以在分析技能对象来源的时候常常要将OD和CE配合来使用。下面我们来分析下《天堂2》的技能列表。 首…

拼多多存在多种重大风险

来源:猛兽财经 作者:猛兽财经 中国电子商务市场发展迅速 拼多多(PDD)目前已经成为了在中国发展最快的电子商务平台之一。随着拼多多、阿里巴巴(BABA)和京东(JD)等市场主要参与者的竞争,中国电子商务正在迅速发展。 由…

安装SceneBuilder时出现Verify that you have access to that directory报错,解决方法之一

1、问题描述 安装SceneBuilder时出现Error writing to file...Verify that you have access to that directory报错,如图 2、解决步骤 1)SceneBuilder-19.0.0.msi可从参考教程链接1获取,下载到文件夹D:\LcSceneBuilder\SceneBuilder-19.0.0…

Spring Cloud融合gateway自带GatewayFilter使用 | Spring Cloud 15

一、Spring Cloud Gateway内置GatewayFilter 路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。 官网地址:https://docs.spring.io/spring-cloud-gateway…

MATLAB与图像处理的那点小事儿~

目录 一、学习内容 二、matlab基本知识 三、线性点运算 四、非线性点运算,伽马矫正 五、直方图 1、直方图均衡化 (1)使用histep函数实现图像均衡化 (2)使用自行编写的均衡化函数实现图像均衡化 2、直方图规定…

Ansys Zemax | 如何使用 OpticStudio 非序列优化向导

本文描述了如何使用 OpticStudio 非序列优化向导创建常见的评价函数类型,以及创建用于匹配导入图像文件的目标能量分布评价函数。(联系我们获取文章附件) 简介 在非序列模式下优化光学系统通常比在序列模式下的优化更复杂、更耗时。下期我们…

TencentOS tiny 移植到STM32F103教程

一、移植前的准备工作1. STM32的裸机工程模板这个可以自己创建(创建过程参考之前的STM32裸机工程也有工程网盘在上面)2.下载TencentOS tiny 源码TencentOS tiny的源码可从TencentOS tiny GitHub仓库地址https://github.com/Tencent/TencentOS-tiny下载&a…

无人机动力测试台:150kg级-Flight Stand 150

“飞行汽车”被人们广泛视为下一代交通工具。从2022年初至今,eVTOL(电动垂直起降飞行器)产业乃至整个UAM(城市间空中交通)市场呈现爆发式增长——各国航空制造企业纷纷入局,不断有新产品问世、试飞或试运行…

吐血整理,web自动化测试,POM模式搭建自动化测试框架(超级详细)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 POM设计模式 主要是…

IO多路复用(select、poll、epoll网络编程)

目录一、高级IO相关1.1 同步通信和异步通信1.2 阻塞与非阻塞1.3 fcntl 函数二、五种IO模型2.1 阻塞式IO模型2.2 非阻塞式IO模型2.3 多路复用IO模型2.4 信号驱动式IO模型2.5 异步IO模型三、认识IO多路复用四、select4.1 认识select函数4.2 select函数原型4.3 select网络编程4.4 …

脂肪毒性的新兴调节剂——肠道微生物组

谷禾健康 肠道微生物组与脂质代谢:超越关联 脂质在细胞信号转导中起着至关重要的作用,有助于细胞膜的结构完整性,并调节能量代谢。 肠道微生物组通过从头生物合成和对宿主和膳食底物的修饰产生了大量的小分子。 最近的研究表明,由…

[计算机操作系统(第四版 汤小丹 汤子瀛)]第一章 操作系统引论(学习复习笔记)

操作系统(Operating System,OS)是配置在计算机硬件上的第一层软件,是对硬件系统的首次扩充。操作系统的主要作用: 管理硬件设备,提高他们的利用率和系统吞吐量 利用率:使硬件充分忙碌系统吞吐量…

MQTT协议-心跳请求和心跳响应

MQTT协议-心跳请求和心跳响应 心跳请求是客户端发送给服务器的,心跳响应是服务器回应给客户端的 作用是保持客户端与服务器之间的连接 CONNECT报文的可变报头是由协议名(Procotol Name)协议级别(Procotol Level)连接…