SQL语句的执行过程

Posted 明矾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句的执行过程相关的知识,希望对你有一定的参考价值。

在数据库管理工具端输入一条SQL语句并获得响应结果通常会经过哪些过程,这就得首先了解我们的数据库结构:

数据库结构可分为四层

1.存储管理层:包括存储管理、日志管理、并发控制、事务管理、缓冲区管理和封锁管理等;

2.SQL处理层:包括SQL语法解析、重写、优化、执行、执行计划缓存与结果集缓存;

3.接口层:比如常用的JDBC、ODBC等;

4.工具层,比如常用的数据库对象管理工具;

 

SQL的查询执行计划

SQL的查询执行计划主要包括查询分析和查询优化

输入SQL字符串--词法分析--语法分析--语义分析--构造查询分析树--重写查询分析树(包括视图的实现和用户自定义规则)

 

记录下SQL语句在执行过程中的处理:

在ORACLE数据库系统架构下,SQL语句由用户进程产生,然后传到相对应的服务端进程,之后由服务器进程执行该SQL语句,如果是SELECT语句,服务器进程还需要将执行结果回传给用户进程。

首先是解析:目的是确定执行计划,找到最优的执行方案。分为软解析(已经有解析完成的缓存,解析过的SQL会有一个hash值与之相对应)和硬解析(语法分析,语义分析,权限检查,视图转换和表达式转换,决定最优的执行计划,缓存SQL文本,解析树,执行计划)

绑定:SQL语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值

执行:不同的操作执行过程不一样,查询操作(缓冲区缓存(可以设置),逻辑读取,物理读取),修改操作(首先确定是否在缓冲区缓存中,如果不在将数据弄到数据库缓存中,对修改的数据取得数据行锁定,取得独占锁,日志缓冲区交互,数据修改,变为脏缓冲)

提取:只有select语句才有,获得查询的结果,必要的时候对结果进行排序。

 

SELECT查询

检查所需的数据块是否已经在缓冲区缓存中,如果已经在缓冲区缓存中,直接读取器内容即可。这种读取方式称为逻辑读取。如果所需数据不在缓冲区缓存中,则服务器进程需要先扫描数据块,读取相应数据块到缓冲区缓存,这种读取方式称为物理读。和逻辑读相比较,它更加耗费CPU和IO资源。

修改操作(INSERT、UPDATE、DELETE)

Step 1:检查所需的数据库是否已经被读取到缓冲区缓存中。如果已经存在缓冲区缓存,则执行Step 3

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

Step 3:对想要修改的表取得的数据行锁定(Row Exclusive Lock),之后对所需要修改的数据行取得独占锁

Step 4:将撤销数据的Redo记录复制到日志缓冲区,产生数据行的撤销数据,将数据行修改的Redo记录复制到日志缓冲区,修改数据行。

Step 5: 产生数据修改的撤销数据

Step 6:复制数据修改的Redo记录到日志缓冲区

Step 7:修改数据行的内容,如果之前的缓冲为干净缓冲,则此时将变为脏缓冲。

以上是关于SQL语句的执行过程的主要内容,如果未能解决你的问题,请参考以下文章

Oracle [存储过程] 执行动态拼接SQL语句并返回结果??

MySQL之SQL语句执行过程

MySQL之SQL语句执行过程

MySQL之SQL语句执行过程

oracle存储过程中执行查询sql语句报错

MyBatis核心源码深度剖析SQL执行过程