Oracle硬解析与软解析分别是什么?


硬解析和软解析有相同的一步 。而软软解析与硬解析、软解析完全不一样 。先来说下理论上的东西 。然后来做个实验 。
硬解析过程:
1.语法、语义及权限检查;
2.查询转换(通过应用各种不同的转换技巧 。会生成语义上等同的新的SQL语句 。如count(1)会转为count(*));
3.根据统计信息生成执行计划(找出成本最低的路径 。这一步比较耗时);
4.将游标信息(执行计划)保存到库缓存 。
软解析过程:
1.语法、语义及权限检查;
2.将整条SQL hash后从库缓存中执行计划 。
软解析对比硬解析省了三个步骤 。
软软解析过程:
要完全理解软软解析先要理解游标的概念 。当执行SQL时 。首先要打开游标 。执行完成后 。要关闭游标 。游标可以理解为SQL语句的一个句柄 。
在执行软软解析之前 。首先要进行软解析 。MOS上说执行3次的SQL语句会把游标缓存到PGA 。这个游标一直开着 。当再有相同的SQL执行时 。则跳过解析的所有过程直接去取执行计划 。
SQL> drop table test purge;
【Oracle硬解析与软解析分别是什么?】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

Oracle硬解析与软解析分别是什么?

文章插图
可以看到软解析与软软解析相比 。软软解析只是解析一次 。
字段解释:
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中取出执行计划 。从而跳过硬解析的所有步骤 。

推荐阅读