转-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提取数据
原网址:http://blog.csdn.net/gyb2013/article/details/6888922
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。