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:修改数据行的内容,如果之前的缓冲为干净缓冲,则此时将变为脏缓冲。