暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
硬解析与软解析
464
7页
27次
2020-04-11
免费下载
--=======================
-- Oracle 硬解析与软解析
--=======================
Oracle 硬解析与软解析是我们经常遇到的问题,什么情况会产生硬解析,什么情况产生软解析,又当如
何避免硬解析?下面的描述将给出
软硬解析的产生,以及硬解析的弊端和如何避免硬解析的产生。
一、SQL 语句的执行过程
当发布一条 SQL PL/SQL 命令时,Oracle 会自动寻找该命令是否存在于共享池中来决定对当前的语句
使用硬解析或软解析。
通常情况下,SQL 语句的执行过程如下:
a.SQL 代码的语法(语法的正确性)及语义检查(对象的存在性与权限)
b. SQL 代码的文本进行哈希得到哈希值。
c.如果共享池中存在相同的哈希值,则对这个命令进一步判断是否进行软解析,否则到 e 步骤。
d.对于存在相同哈希值的新命令行,其文本将与已存在的命令行的文本逐个进行比较。这些比较包括大小
写,字符串是否一致,空格,注释
等,如果一致,则对其进行软解析,转到步骤 f。否则到 d 步骤。
e.硬解析,生成执行计划。
f.执行 SQL 代码,返回结果。
二、不能使用软解析的情形
1.下面的三个查询语句,不能使用相同的共享 SQL 区。尽管查询的表对象使用了大小写,但 Oracle 为其
生成了不同的执行计划
select * from emp;
select * from Emp;
select * from EMP;
2.类似的情况,下面的查询中,尽管其 where 子句 empno 的值不同,Oracle 同样为其生成了不同的执行
计划
select * from emp where empno=7369
select * from emp where empno=7788
3.在判断是否使用硬解析时,所参照的对象及 schema 应该是相同的,如果对象相同,而 schema 不同,
则需要使用硬解析,生成不同的执行计划
sys@ASMDB> select owner,table_name from dba_tables where table_name like
'TB_OBJ%';
OWNER TABLE_NAME
------------------------------ ------------------------------
USR1 TB_OBJ --两个对象的名字相同,当所有
者不同
SCOTT TB_OBJ
usr1@ASMDB> select * from tb_obj;
scott@ASMDB> select * from tb_obj; --此时两者都需要使用硬解析以及走不同的执行
计划
三、硬解析的弊端
硬解析即整个 SQL 语句的执行需要完完全全的解析,生成执行计划。而硬解析,生成执行计划需要耗用
CPU 资源,以及 SGA 资源。在此不
得不提的是对库缓存中闩的使用。闩是锁的细化,可以理解为是一种轻量级的串行化设备。当进程申请到
闩后,则这些闩用于保护共享内存
的数在同一时刻不会被两个以上的进程修改。在硬解析时,需要申请闩的使用,而闩的数量在有限的情况
下需要等待。大量的闩的使用由此
造成需要使用闩的进程排队越频繁,性能则逾低下。
四、硬解析的演示
下面对上面的两种情形进行演示
在两个不同的 session 中完成,一个为 sys 帐户的 session,一个为 scott 账户的 session,不同的
session,其 SQL 命令行以不同的帐户名开头
" sys@ASMDB> " 表示使用时 sys 帐户的 session" scott@ASMDB> "表示 scott 帐户的
session
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
-------------------- ---------- ---------- --当前的硬解析值为 569
parse count (hard) 64 569
scott@ASMDB> select * from emp;
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
-------------------- ---------- ---------- --执行上一个查询后硬解析值
570,解析次数增加了一次
parse count (hard) 64 570
scott@ASMDB> select * from Emp;
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
-------------------- ---------- ---------- --执行上一个查询后硬解析值
571
parse count (hard) 64 571
scott@ASMDB> select * from EMP;
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
-------------------- ---------- ---------- --执行上一个查询后硬解析值
572
parse count (hard) 64 572
scott@ASMDB> select * from emp where empno=7369;
sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;
NAME CLASS VALUE
-------------------- ---------- ---------- --执行上一个查询后硬解析值
573
parse count (hard) 64 573
of 7
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜