SQL执行过程详解
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 进程还没有全部完成的后续动作得到了保障。
相关文章:
SQL执行过程详解
1 、用户在客户端执行 SQL 语句时,客户端把这条 SQL 语句发送给服务端,服务端的进程,会处理这条客户端的SQL语句。 2 、服务端进程收集到SQL信息后,会在进程全局区PGA 中分配所需内存,存储相关的登录信息等。 3 、客…...
【物联网NodeJs-5天学习】第四天存储篇⑤ ——PM2,node.js应用进程管理器
【NodeJs-5天学习】第四天存储篇⑤ ——PM2,node.js应用进程管理器1. 前言2. 官方说明3. 安装PM24. PM2常用命令4.1 启动命令4.2 重新启动命令4.3 热重载命令4.4 停止命令4.5 删除命令4.6 查看进程运行状态4.4 显示某一个进程的具体信息4.8 显示日志信息4.9 终端监控…...
【C++学习】【STL】deque容器
dequeDouble Ended Queues(双向队列)deque和vector很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内…...
当 App 有了系统权限,真的可以为所欲为?
看到群里发了两篇文章,出于好奇,想看看这些个 App 在利用系统漏洞获取系统权限之后,都干了什么事,于是就有了这篇文章。由于准备仓促,有些 Code 没有仔细看,感兴趣的同学可以自己去研究研究,多多…...
vue3.js的介绍
一.vue.js简述 Vue是一套用于构建用户开源的MVVM结构的Javascript渐进式框架,尤雨溪在2015年10月27日发布了vue.js 1.0Eavangelion版本,在2016年9月30日发布了2.0Ghost in the Shell版本,目前项目由官方负责 vue的核心只关注图层࿰…...
【Three.js】shader特效 能量盾
shader特效之能量盾前言效果噪点图主要代码index.htmldepth-fs.jsdepth-vs.jsshield-fs.jsshield-vs.js相关项目前言 效果噪点图 为了可以自定义能量球的效果,这里使用外部加载来的噪点图做纹理,省去用代码写特效的过程。 主要代码 index.html <…...
【6000字长文】需求评审总是被怼?强烈推荐你试试这三招
前段时间和一个合作部门的产品新人沟通需求,结束的时候,他问了我一个问题,“你在产品新人阶段,最害怕做的事情是什么”? 我不假思索的回答说,“需求评审,是曾经最不想面对的环节,甚至在评审之前几个小时就开始心跳加速了。当然这也是产品修炼路上的必经之路,其实只要掌…...
Hive介绍及DDL
1.OLTP和OLAP OLTP: 联机事务处理系统。在前台接收的用户数据可以立即传送到后台进行处理,并在很短的时间内给出处理结果。关系型数据库是OLTP典型应用,如MySQL OLTP环境开展数据分析是否可行? 为了更好的开展数据分析&#x…...
Simulink 自动代码生成电机控制:在某国产ARM0定点MCU上实现自动代码生成无感电机控制
目录 前言 开发流程 定点化的技巧 代码生成运行演示 总结 前言 这次尝试了在国产arm0内核的MCU上实现Simulink自动代码生成永磁同步电机无传感控制。机缘巧合之下拿到了一块国产MCU的电机控制板和一个5000RPM的小电机。最后实现了无传感控制,在这里总结下一些经…...
MySQL基本查询
文章目录表的增删查改Create(创建)单行数据 全列插入多行数据 指定列插入插入否则更新替换Retrieve(读取)SELECT列全列查询指定列查询查询字段为表达式查询结果指定别名结果去重WHERE 条件基本比较BETWEEN AND 条件连接OR 条件连…...
你需要知道的 7 个 Vue3 技巧
VNode 钩子在每个组件或html标签上,我们可以使用一些特殊的(文档没写的)钩子作为事件监听器。这些钩子有:onVnodeBeforeMountonVnodeMountedonVnodeBeforeUpdateonVnodeUpdatedonVnodeBeforeUnmountonVnodeUnmounted我主要是在组件…...
行政区划获取
行政区划获取一、导入jar包二、代码展示背景:公司的行政区划代码有问题,有的没有街道信息,有的关联信息有误,然后找到了国家的网站国家统计局-行政区划,这个里面是包含了所有的行政信息,但是全是html页面&a…...
让ChatGPT介绍一下ChatGPT
申请新必应内测通过了,我在New Bing中使用下ChatGPT,让ChatGPT介绍一下ChatGPT 问题1:帮我生成一篇介绍chatGPT的文章,不少于2000字 回答: chatGPT是什么?它有什么特点和用途? chatGPT是一种…...
【Redis】Redis 主从复制 + 读写分离
Redis 主从复制 读写分离1. Redis 主从复制 读写分离介绍1.1 从数据持久化到服务高可用1.2 主从复制1.3 如何保证主从数据一致性?1.4 为何采用读写分离模式?2. 一主两从环境准备2.1 配置文件2.2 启动 Redis3. 主从复制原理3.1 全量同步3.1.1 建立连接3…...
2023届秋招,鬼知道我经历了什么
仅记录个人经历,充满主观感受,甚至纯属虚构,仅供参考,杠就是你对 本想毕业再写,但是考虑到等毕业了,24秋招的提前批就快开始了,大概就来不及了,正好现在有点时间,陆陆续…...
ChatGPT助力校招----面试问题分享(一)
1 ChatGPT每日一题:期望薪资是多少 问题:面试官问期望薪资是多少,如何回答 ChatGPT:当面试官问及期望薪资时,以下是一些建议的回答方法: 1、调查市场行情:在回答之前,可以先调查一…...
CSS媒体查询@media (prefers-color-scheme:dark)判断系统白天黑夜模式
前言 在最近学习中突然看到了在媒体查询中prefers-color-scheme:dark监听的使用,然后就模仿里边写了个简单例子,代码如下: body {background-color: #f5f5f5;}media (prefers-color-scheme: dark) {body {background-color: #666;}}然后通过…...
运行YOLOv8实现识别
https://github.com/ultralytics/ultralyticshttps://docs.ultralytics.com/环境配置官方环境要求Python>3.7(我是python3.8也是可以用的) environment with PyTorch>1.7.这是ultralyticsCommand Line Interface命令行接口运行输入参数的格式yolo …...
如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行
当您在 Linux 的命令行上工作时,有时希望快速查看文件的第一行,例如,有个日志文件不断更新,希望每次都查看日志文件的前 10 行。很多朋友使用文本编辑的命令是vim,但还有个命令head也可以让轻松查看文件的第一行。 在…...
Nginx.conf 配置详解
#安全问题,建议用nobody,不要用root. #user nobody; #worker数和服务器的cpu数相等是最为适宜 worker_processes 2; #work绑定cpu(4 work绑定4cpu) worker_cpu_affinity 0001 0010 0100 1000 #error_log path(存放路径) level(日志等级) path表示日志路径&…...
剖析NLP历史,看chatGPT的发展
1、NLP历史演进 1.1 NLP有监督范式 NLP里的有监督任务的范式,可以归纳成如下的样子。 输入是字词序列,中间一步关键的是语义表征,有了语义表征之后,然后交给下游的模型学习。所以预训练技术的发展,都是在围绕怎么…...
20个Python使用小技巧,建议收藏~
1、易混淆操作 本节对一些 Python 易混淆的操作进行对比。 1.1 有放回随机采样和无放回随机采样 import random random.choices(seq, k1) # 长度为k的list,有放回采样 random.sample(seq, k) # 长度为k的list,无放回采样1.2 lambda 函数的参数 …...
Kafka 主题管理
Kafka 主题管理创建主题查看主题修改主题内部主题异常主题删除失败创建主题 创建 Kafka 主题 create : 创建主题partitions : 主题的分区数replication-factor : 每个分区下的副本数 bin/kafka-topics.sh \ --bootstrap-server broker_host:port \ --create --topic my_topi…...
【深度学习】GPT系列模型:语言理解能力的革新
GPT-1🏡 自然语言理解包括一系列不同的任务,例如文本蕴涵、问答、语义相似度评估和文档分类。尽管大量的未标记文本语料库很充足,但用于学习这些特定任务的标记数据却很稀缺,使得判别式训练模型难以达到良好的表现。我们证明&…...
【Vue.js】全局状态管理模式插件vuex
文章目录全局状态管理模式Vuexvuex是什么?什么是“状态管理模式”?vuex的应用场景Vuex安装开始核心概念一、State1、单一状态树2、在 Vue 组件中获得 Vuex 状态3、mapState辅助函数二、Getter三、Mutation1、提交载荷(Payload)2、…...
JPA 之 Hibernate EntityManager 使用指南
Hibernate EntityManager 专题 参考: JPA – EntityManager常用API详解EntityManager基本概念 基本概念及获得 EntityManager 对象 基本概念 在使用持久化工具的时候,一般都有一个对象来操作数据库,在原生的Hibernate中叫做Session&…...
英语作文提示(持续更新)
星期(介词on)Monday星期一Tuesday星期二Wednesday星期三Thursday星期四Friday星期五Saturday星期六Sunday星期日月份(介词in)lunar calendar农历on the second day of the second lunar农历初二January1月February2月March3月Apri…...
【计算机组成原理】计算机的性能指标、数据的表示和运算、BCD码和余3码
计算机组成原理(二) 计算机的性能指标: 存储器的性能指标: 存储器中,MAR为存储单元的个数 MDR为机械字长也就是存储单元的长度 存储器的大小MAR*MDR n为二进制位能表示出几种不同的状态呢? 2的n次方种不同的状态 CPU的性能指标…...
三天吃透MySQL八股文(2023最新整理)
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
队列_23约瑟夫问题+_24猫狗收容所
约瑟夫问题 n 个小孩围坐成一圈,并按顺时针编号为1,2,…,n,从编号为 p 的小孩顺时针依次报数,由1报到m ,当报到 m 时,该小孩从圈中出去,然后下一个再从1报数,当报到 m 时再出去。如此反复&#…...
哈尔滨网站制作工程/网站建设公司哪家好?该如何选择
1. 介绍 在大多数情况10位精度已经足够了,但是某些情况下需要更高的精度。特殊的信号处理技术可以用来提高测量的精度。使用一种称为“过采样和抽取”的方法可以得到较高的精度,不需要使用外部的ADC。 Figure 1-1. 增加分辨率 2. 操作理论 ADC…...
销售推广案例网站/现在做推广的新渠道有哪些
在关系型数据库中,如果要设计成表机制来存储数据,必须满足基本的范式,至少满足前三个范式。第一范式(1NF):是指在关系模型中,对域(域代表字段)添加的一个规范要求,所有的域都应该是原子性的(不可分拆),即数据库表的每一列都是不可…...
网站建设行业新闻/百度小说搜索排行榜
1、 string str1; str2 //语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如: if(str1.EndsWith(str2)){ Response.Write("字串str1是以"str2"结束的"); } 2、 //语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回…...
什么是静态网站和动态网站/新手做外贸怎么入门
oracle 的命名规则:1、要以字母开头2、包含字母和数字,以及# $3、不能超过30个字符 oracle基本数据类型数据类型参数描述char(n)n1 to 2000字节定长字符串,n字节长,如果不指定长度,缺省为1个字节长(一个汉字…...
网站在当地做宣传/百度竞价排名的利与弊
点击左上方蓝字关注我们AI大佬吴恩达每天都会做的一件事:看论文!Paper的重要性不言而喻。然而,论文一直是广大同学的AI“拦路虎”:从阅读到复现,抓不住重点,不了解课题、无法复现......百度作为「中国AI头雁…...
深圳电商网站设计/海外发布新闻
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 简书支持程序员写技术博客的模式,Markdown具有一系列衍生版本,用于扩展Markdown的功能(如表格、脚注、…...