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

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;

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中取出执行计划。从而跳过硬解析的所有步骤。

您还感兴趣的文章推荐

以上就是由互联网推广工程师 桔子生活网 整理编辑的,如果觉得有帮助欢迎收藏转发~

分享到 :
相关推荐

回复 寄心梦 取消回复

登录... 后才能评论

评论(2)

  • 陌清茗 永久VIP 2022年12月28日 07:19:20

    语句,游标,计划,过程,语义,数据,步骤,缓存,语法,多个

  • 寄心梦 永久VIP 2022年12月28日 07:19:20

    没想到大家都对Oracle硬解析与软解析分别是什么?感兴趣,不过这这篇解答确实也是太好了

  • 擦掉眼泪我依然是王 永久VIP 2022年12月28日 07:19:20

    硬解析和软解析有相同的一步。而软软解析与硬解析、软解析完全不一样。先来说下理论上的东西。然后来做个实验。硬解析过程: