oracle sql执行过程分析

在oracle中存在这样两种语句类型:DDL(create、drop、alter、truncate)、DML(insert、update、delete、select)。

DDL语句是从来不会共享使用的,也就是说每次执行都是硬解析,而DML语句会根据实际情况选择解析方式(硬解析或软解析)。下面我们主要对DML类sql语句的执行过程进行分析:

oracle对DML类sql语句的执行步骤如下:

1.语法检查

 语句检查主要是对sql语句的规范合法行进行检查,比如关键字select、from 写错等:

SQL> sele * from dual;
 
sele * from dual
   
ORA-00900: invalid SQL statement

2.语义检查

检查sql语句中对象名(表或字段等)是否存在以及对这些对象是否有相应的操作权限,比如表或列是否在该用户下存在,该用户是否有操作该表或列的权限等:

SQL> select * from dualtest;
 
select * from dualtest
 
ORA-00942: table or view does not exist

3.检查共享池sql副本

 SGA的共享池(share pool)中若存在相同的sql副本,则跳过第4步,直接选择共享池中已存在的sql语句和执行计划进行执行。(省掉了服务器分析和生成最佳执行计划这一步,这一步也是最耗费资源的,达到sql共享和执行计划的重用,这一点在OLTP系统性能中非常重要)

对于共享池是否存在相同sql副本的判断标准:

    a) 验证sql语句文本是否完全相同(包括大小写、空格、换行等)

        oracle对传过来的sql会进行一个hash运算(使用LRU最近最少使用算法),然后在共享池中检查是否有相同的hash值存在。若hash值相等还需要检验条件b。

    b)验证sql语句执行对象和执行环境是否相同

        sql文本完全相同后,还需要检查访问对象是否相同,比如访问的表是否是同一个表,若是其他用户下的同名表,服务器也会判断为不同sql。

        sql的执行环境,比如使用的优化方案不同,服务器也会判断为不同sql。

所以:只有当sql文本、sql执行对象和执行环境都完全相同的情况下,才说明共享池中存在sql副本。

4.确定执行计划(硬解析)

        CBO(从oracle10g2版本开始RBO已被废除)将会对sql语句进行分析、产生所有可能的执行计划和相应的Cost,最终选择Cost最低的那个最佳执行计划。这个步骤也是解析中最耗费资源的(硬解析)。当确定这条查询语句的最佳执行计划后,就会将这条SQL语句与执行计划保存到共享池中,在这条sql语句的生命周期里若还有这个查询时,就会省略这一步骤,而直接执行SQL语句,提取数据。

5.执行sql提取数据

阅读更多
上一篇oracle 单引号拼凑和动态sql
下一篇oracle ITL(事务槽)的理解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭