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提取数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值