Oracle之SQL语句执行过程解析
来源:互联网 发布:浪人网络 时代店 编辑:程序博客网 时间:2024/05/16 14:20
导读:
一、Oracle数据库的体系结构
1、6大内存区;
2、5大后台进程;
3、3大文件类型;
二、SQL语句执行过程分析
1、客户端把sql语句发给服务器端执行;
2、SQL语句解析(parse)
(1)查共享池的库缓存(library cache);
(2)检查SQL语句的合法性;
(3)检查SQL语言含义;
(4)获得对象解析锁;
(5)数据访问权限的核对;
(6)确定最佳执行计划
3、SQL语句执行(exec);
4、提取数据(fetch)。
一、Oracle数据库的体系结构
简单了解一下Oracle的体系结构:主要有6大内存区、5大后台进程、3大文件类型。
这些具体的内容会在以后的文章中陆续分析到。下图所示为Oracle体系结构图。
1、6大内存区:(1)共享池(shared pool)
(2)数据库缓存区高速缓存(buffer cache)
(3)重做日志缓存区(redo log cache)
(4)Java池
(5)streams池
(6)大型池(large)
2、5大后台进程:
(1)PMON:进程监视进程(Process Monitor Process)。
(2)SMON:系统监视进程(System Monitor Process)。
(3)DBWn:数据库写入进程(Database Writer Process),将信息从SGA的数据库
缓冲存储区中写入到数据库数据文件中。
(4)LGWR:日志写入进程(Log Writer Process),将生成的REDO信息从日志缓冲
区写入到数据库联机REDO日志中。
(5)CKPT:检查点进程(Checkpoint Process),在检查点操作期间,CKPT进程会
通知DBWn检查此点。
3、3大文件类型:
(1)ctl控制文件:记录数据库的物理结构信息、当前运行的状态信息等。
(2)dbf数据文件:Oracle表信息。
(3)log重做日志文件:记录数据文件块所有的操作变化过程。
二、SQL语句执行过程分析
1、客户端把sql语句发给服务器端执行
客户端输入一条SQL语句执行后,客户端会把这条语句发给服务器端执行,服务器端就会让服务器
进程(server process)来处理。Oracle客户端是不会做任何的操作,他的主要任务就是把客户端产生
的一些SQL语句发送给服务器端。
需要注意:客户端的数据库进程跟服务器的数据库进程是一一对应的。
2、SQL语句解析(parse)
SQL语句的解析也是在服务器端进行的,也是通过服务器进程(server process)进行解析。而且解
析类型也分硬解析和软解析。
(1)查共享池的库缓存(library cache)
服务器进程(server process)接到客户端发来的SQL语句不会直接去数据库中查找数据,而是
先要到共享池的库缓存(library cache:专门存放SQL语句及其对应的执行计划)中查找是否存在相同
语句的执行计划。如果有,则服务器进程就会立即执行该执行计划。从而省去了从磁盘文件中读取文
件数据,也省去了语句的解析过程。
(2)检查SQL语句的合法性
服务器进程没有在共享池的库缓存(library cache)中找到相同的执行计划,则数据库服务器进程
就会开始检查这条语句的合法性。这里主要是对SQL语句的语法进行检查,看看其是否合乎语法规则。
如果服务器进程认为这条SQL语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在
这个语法检查的过程中,不会对SQL语句中所包含的表名、列名等等进行检查,他只是语法上的检查。
(3)检查SQL语言含义
若SQL语句符合语法上的定义的话,则服务器进程接下去会对语句中的字段、表等内容进行检查。
看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户
端。所以,有时候我们写select语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示
说语法错误,等到语法完全正确后,再提示说列名或表名错误。
(4)获得对象解析锁
当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止
我们在查询的过程中,其他用户对这个对象的结构发生改变。对于加锁的原理与方法,将在后续文章中做
详细阐述,此处就不再赘述。
(5)数据访问权限的核对
当语法、语义通过检查之后,客户端还不一定能够取得数据。服务器进程还会检查,所连接的用户是否
有这个数据访问的权限。若连接上服务器的用户不具有数据访问权限的话,则客户端就不能够取得这些数
据。这在前端应用软件开发调试的过程中,可能会经常碰到。
注意:数据库服务器进程先检查语法与语义,然后才会检查访问权限。
(6)确定最佳执行计划
当上面的步骤都没问题后,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的
规则,对这条语句进行优化。不过此处说的这个优化是有限的。一般在应用软件开发的过程中,需要对数
据库的sql语言进行优化,这个优化的作用要大大地大于服务器进程的自我优化。所以,一般在应用软件
开发的时候,数据库的优化是少不了的。
当服务器进程的优化器确定这条查询语句的最佳执行计划后,就会将这条SQL语句与执行计划保存到共
享池的库缓存(library cache)中。等以后还有这个查询时,就会省略以上的语法、语义与权限检查
的步骤,而直接执行SQL语句,提高SQL语句处理效率。
3、SQL语句执行(exec)
语句解析只是对SQL语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意思。等
到语句解析完成之后,数据库服务器进程才会真正的执行这条SQL语句。这个语句执行也分两种情况。
一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递给客
户端,而不是从数据库文件中去查询数据。
若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲区中。
Oracle数据库中,定义了很多种类的高速缓存。像上面所说的SQL语句缓存与现在讲的数据缓存。在学
习数据库的时候,需要对这些缓存有清晰的认识,并了解各个种类缓存的作用。这对后续数据库维护与数
据库优化是非常有用的。
4、提取数据(fetch)
当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,
在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给
用户端进程,从而完成整个查询动作。
- Oracle之SQL语句执行过程解析
- Oracle SQL语句执行过程
- Oracle SQL语句执行过程
- oracle sql语句解析过程
- Oracle执行SQL语句的过程
- oracle 中sql 语句的执行过程
- oracle执行sql语句的过程
- Oracle执行SQL语句的过程
- Oracle的sql语句执行过程
- Oracle sql语句执行过程图文分析
- Oracle执行SQL语句的过程
- Oracle执行SQL语句的过程
- Oracle执行SQL语句的过程
- ORACLE数据库SQL语句的执行过程
- ORACLE数据库SQL语句的执行过程
- oracle解析SQL语句的过程
- Oracle 语句执行过程
- sql语句执行过程
- 身体永远是奋斗的本钱
- java中wait()\notify()\notifyAll()解析
- Java之《ssm》第三方登录微博登录
- 几款好用的谷歌卫星地图下载器
- 水听器灵敏度的计算
- Oracle之SQL语句执行过程解析
- 13:58:36,128 WARN Dispatcher:68
- Android——科大讯飞语音集成
- origin 三维坐标中 多条曲线 waterfall 绘图
- shiro 拦截器
- python numpy学习
- ANR处理
- UTF-8基础
- 第1章事件