热门回答:
硬解析和软解析有相同的一步。而软软解析与硬解析、软解析完全不一样。先来说下理论上的东西。然后来做个实验。
硬解析过程:
1.语法、语义及权限检查;
2.查询转换(通过应用各种不同的转换技巧。会生成语义上等同的新的SQL语句。如count(1)会转为count(*));
3.根据统计信息生成执行计划(找出成本最低的路径。这一步比较耗时);
4.将游标信息(执行计划)保存到库缓存。
软解析过程:
1.语法、语义及权限检查;
2.将整条SQL hash后从库缓存中执行计划。
软解析对比硬解析省了三个步骤。
软软解析过程:
要完全理解软软解析先要理解游标的概念。当执行SQL时。首先要打开游标。执行完成后。要关闭游标。游标可以理解为SQL语句的一个句柄。
在执行软软解析之前。首先要进行软解析。MOS上说执行3次的SQL语句会把游标缓存到PGA。这个游标一直开着。当再有相同的SQL执行时。则跳过解析的所有过程直接去取执行计划。
SQL> drop table test purge;
SQL> alter system flush shared_pool;
SQL> create table test as select * from dba_objects where 1<>1;
SQL> exec dbms_stats.gather_table_stats(user,'test');
硬解析:
SQL> select * from test where object_id=20;
未选定行
SQL> select * from test where object_id=30;
未选定行
SQL> select * from test where object_id=40;
未选定行
SQL> select * from test where object_id=50;
未选定行
软解析:
SQL> var oid number;
SQL> exec :oid:=20;
SQL> select * from test where object_id=:oid;
未选定行
SQL> exec :oid:=30;
SQL> select * from test where object_id=:oid;
未选定行
SQL> exec :oid:=40;
SQL> select * from test where object_id=:oid;
未选定行
SQL> exec :oid:=50;
SQL> select * from test where object_id=:oid;
未选定行
软软解析:
SQL> begin
for i in 1..4 loop
execute immediate 'select * from test where object_id=:i' using i;
end loop;
end;
/
SQL> col sql_text format a40
SQL> select sql_text,s.PARSE_CALLS,loads,executions from v$sql s
where sql_text like 'select * from test where object_id%'
order by 1,2,3,4;
SQL_TEXT PARSE_CALLS LOADS EXECUTIONS
可以看到软解析与软软解析相比。软软解析只是解析一次。
字段解释:
PARSE_CALLS 解析的次数
LOADS 硬解析的次数
EXECUTIONS 执行的次数
其他观点:
Oracle中每条SQL语句在执行之前都需要经过解析。这里面又分为软解析和硬解析。在Oracle中存在两种类型的SQL语句。一类为 DDL语句(数据定义语言)。他们是从来不会共享使用的。也就是每次执行都需要进行硬解析。还有一类就是DML语句(数据操纵语言)。他们会根据情况选择要么进行硬解析。要么进行软解析。要么将SQL文本等装载进library cache中的heap中。
1.硬解析
硬解析一般包括下面几个过程:
1)对SQL语句进行语法检查。看是否有语法错误。比如select from where 等的拼写错误。如果存在语法错误。则推出解析过程;
2)通过数据字典(row cache)。检查SQL语句中涉及的对象和列是否存在。如果不存在。则推出解析过程。
3)检查SQL语句的用户是否对涉及到的对象是否有权限。如果没有则推出解析;
4)通过优化器创建一个最优的执行计划。这个过程会根据数据字典中的对象的统计信息。来计算多个执行计划的cost。从而得到一个最优的执行计划。这一步涉及到大量的数据运算。从而会消耗大量的CPU资源;(library cache最主要的目的就是通过软解析来减少这个步骤);
5)将该游标所产生的执行计划。SQL文本等装载进library cache中的heap中。
2.软解析
所谓软解析。就是因为相同文本的SQL语句存在于library cache中。所以本次SQL语句的解析就可以去掉硬解析中的一个活多个步骤。从而节省大量的资源的耗费。
3.软软解析
所谓的软软解析。就是不解析。当设置了session_cached_cursors参数时。当某个session第三次执行相同的SQL语句时。则会把该SQL语句的游标信息转移到该session的PGA中。这样。当该session在执行该SQL语句时。会直接从PGA中取出执行计划。从而跳过硬解析的所有步骤。
您还感兴趣的文章推荐
- 为什么喜欢的总是害自己最深的?背后有何规律?
- 在北京月入14k,这种情况下要不要离职呢?
- 在当前社会背景下,学生学历低会导致爹不疼娘不爱且家庭成员不和睦吗?
- 刚刚离职的我现在还能从事哪些工作呢?
- 为何无人治理满大街逆行的送餐骑手?背后原因大揭秘
以上就是由互联网推广工程师 桔子生活网 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.wangchuang8.com/246089.html,转载请说明来源于:桔子生活网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系进行处理。分享目的仅供大家学习与参考,不代表本站立场。
评论(2)
语句,游标,计划,过程,语义,数据,步骤,缓存,语法,多个
没想到大家都对Oracle硬解析与软解析分别是什么?感兴趣,不过这这篇解答确实也是太好了
硬解析和软解析有相同的一步。而软软解析与硬解析、软解析完全不一样。先来说下理论上的东西。然后来做个实验。硬解析过程: