解析的几种方式

一条SQL的执行过程
1.在PGA中进行语法、语义检查(检查执行该SQL语句的用户是否有权限访问某个对象) 
2.检查该SQL是否存在于共享池
3.如果SQL语句不存在就对该SQL进行硬解析,生成执行计划,解析树等等,如果SQL语句存在,就选择最佳执行计划,这个就是软解析
4.执行SQL,返回结果


主要讨论一下oracle的解析方式
1硬解析:SQL转换为HASH_VALUE在shared_pool没找到匹配值
2软解析:省略生成执行计划,解析树等步骤
3软软解析:当执行SQL时,首先要打开游标,执行完成后,要关闭游标,游标可以理解为SQL语句的一个句柄。在执行软软解析之前,首先要进行软解析,MOS上说执行3次的SQL语句会把游标缓存到PGA,当再有相同的SQL执行时,如果游标是关闭的,则打开游标,跳过解析的所有过程直接去取执行计划。

4不解析:执行3次的SQL语句会把游标缓存到PGA,当再有相同的SQL执行时,如果游标是打开的,跳过解析的所有过程直接去取执行计划。(与软软解析区别只在于是否打开游标),可以参考v$open_cursor视图


实验:
硬解析
alter system flush shared_pool;
SCOTT@ fyl>select * from emp where empno=1;
SCOTT@ fyl>select * from emp where empno=2;
SCOTT@ fyl>select * from emp where empno=3;
软解析
SCOTT@ fyl>var eno number
SCOTT@ fyl>exec :eno :=1;
SCOTT@ fyl>select * from emp where empno=:eno;
SCOTT@ fyl>exec :eno :=2;
SCOTT@ fyl>select * from emp where empno=:eno;
SCOTT@ fyl>exec :eno :=3;
SCOTT@ fyl>select * from emp where empno=:eno;
不解析
SCOTT@ fyl>declare 
  2    p_emp emp%rowtype;
  3  begin 
  4    for i in 1 .. 20 loop
  5      execute immediate 'select * from emp where empno=7788' into p_emp;
  6    end loop;
  7   end;
  8   /


SCOTT@ fyl>select hash_value,sql_text,parse_calls,loads, EXECUTIONS from v$sql where sql_text like 'select * from emp%';
HASH_VALUE SQL_TEXT                                                     PARSE_CALLS      LOADS EXECUTIONS
---------- ------------------------------------------------------------ ----------- ---------- ----------
3923248223 select * from emp where empno=2                                        1          1          1       --硬解析
1410730372 select * from emp where empno=1                                        1          1          1       --硬解析
2367053566 select * from emp where empno=:eno                                     3          1          3      --软解析
3663109429 select * from emp where empno=3                                        1          1          1         --硬解析
1075160986 select * from emp where empno=7788                                     1          1         20      --不解析


EXECUTIONS:SQL执行次数
LOADS:硬解析次数
PARSE_CALLS:软解析次数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值