Oracle SQL语句执行过程

Oracle SQL语句执行过程_第1张图片

1、用户在客户端执行 SQL语句时,客户端会把这条 SQL 语句发送给服务器端,让服务器端的进程来处理SQL语句。Oracle 客户端是主要任务就是把客户端产生的一些 SQL 语句发送给服务器端。

2 、服务器进程从用户进程把信息接收到后,在 PGA 中就要为进程分配所需内存,存储相关的信息 。在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程,而服务器上的我们叫做服务器进程。

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

1 )查询高速缓存( library cache )

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

2 )语句合法性检查( data dictionary cache )

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

3 )语言含义检查( data dictionary cache )

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

所以,有时候我们写 select 语句的时候,若语法与表名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后再提示说列名或表名不存在。

4 )获得对象解析锁( control structer )

当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。

5 )数据访问权限的核对( data dictionary cache )

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

6 )确定最佳执行计划

当语法与语义都没有问题权限也匹配,服务器进程还是不会直接对数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。在执行计划开发之前会有一步查询转换,如:视图合并、子查询解嵌套、谓语前推及物化视图重写查询等。为了确定采用哪个执行计划, Oracle 还需要收集统计信息确定表的访问联结方法等,最终确定可能的最低成本的执行计划。

当服务器进程的优化器确定这条查询语句的最佳执行计划后, 就会将这条 SQL 语句与执行计划保存到数据高速缓存( library cache )。如此,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,而直接执行 SQL 语句,提高 SQL 语句处理效率。

4 、绑定变量赋值

如果 SQL 语句中使用了绑定变量,扫描绑定变量的声明,给绑定变量赋值,将变量值带入执行计划。若在解析的第一个步骤, SQL 在高速缓冲中存在,则直接跳到该步骤。

5 、语句执行

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

你可能感兴趣的:(数据库,数据库,oracle)