【DB笔试面试575】在Oracle中,SQL语句的执行过程有哪些?_Oracle

♣          题目         部分

在Oracle中,SQL语句的执行过程有哪些?


     
♣          答案部分          


Oracle数据库里SQL语句的执行过程可以如下图所示:

【DB笔试面试575】在Oracle中,SQL语句的执行过程有哪些?_Oracle_02



在上图中,可以看到SQL语句的执行过程大致分为以下几个步骤:

(1)当用户提交待执行的目标SQL后,Oracle首先会对目标SQL进行解析。在这个过程中,Oracle会先执行对目标SQL的语法、语义和权限的检查:

① 语法检查(Syntax Check)是检查目标SQL的拼写是否正确,例如错将关键字“FROM”写成“FORM”,将“SELECT”写成“SELET”等。

② 语义检查(Semantic Check)是检查SQL语句中的访问对象是否存在及该用户是否具备相应的权限。

(2)如果目标SQL不能通过上述语法、语义和权限的检查,那么该目标SQL将解析失败。如果目标SQL能通过上述检查,那么接下来Oracle就会去SGA的共享池中的库缓存(Library Cache)中查找是否存在匹配的共享游标(Shared Cursor)。如果找到了匹配的共享游标,那么Oracle就会把存储于该共享游标中的解析树和执行计划直接拿过来重用,这相当于跳过了后续的“查询转换”和“查询优化”这两个步骤,直接进入到“实际执行”阶段。

(3)如果找不到匹配的共享游标,就意味着此时没有可以被重用的解析树和执行计划,那么接下来整个执行过程就进入到查询转换这一步。在查询转换过程中,Oracle会根据一些规则来决定是否对目标SQL执行查询转换,这些规则在Oracle不同的版本里不尽相同。在Oracle 9i中,查询转换是独立于优化器的,它与优化器的类型无关,但是从Oracle 10g开始,Oracle会对某些类型的查询转换(比如子查询展开、复杂视图合并等)分别计算经过查询转换后的等价改写SQL的成本和原始SQL的成本。只有当等价改写后SQL的成本值小于未经过查询转换的原始SQL的成本值时,Oracle才会对目标SQL执行查询转换。在执行完查询转换后,原目标SQL可能就被Oracle改写了,当然也有可能没有改写。

(4)接下来,Oracle就正式进入了查询优化这个步骤。在这个步骤里,Oracle会根据不同的优化器类型(CBO或RBO)采用不同的判断原则,从执行完查询转换后得到的目标SQL的诸多可能的执行路径中选择一条效率最高的路径来作为其执行计划,即查询优化的输入就是执行完查询转换后得到的等价改写SQL,其输出就是该目标SQL的最终执行计划。

(5)在得到了目标SQL的执行计划后,接下来Oracle就会根据执行计划去实际执行该SQL,并将执行结果返回给用户。