关于硬解析和软解析



游标解析过程
(1)包含VPD约束条件--如果使用了虚拟私有数据库,并且被解析的SQL语句中引用的某张表激活了它的话,安全策略生成的约束条件就会被添加到WHERE语句中。
(2)语法语义以及访问权限检查
(3)保存父游标--不存在共享的父游标,将在库缓存中分配一些内存,将父游标保存进去
(4)逻辑优化--通过优化手段生成等价意义的SQL语句,同时可选择的执行计划数量与搜索空间都会增长
(5)物理优化--回城生与每个逻辑优化产生的SQL语句相关的执行计划,同时根据统计信息,计算执行计划所用的开销并选择最优的执行计划
(6)保存子游标--分配内存,将共享子游标存储进去,最后将子游标和父游标进行关联




当只执行前两个步骤时,成为软解析,否则为硬解析,其中关键的第五步非常耗资源:第一个原因是逻辑优化和物理优化非常依赖CPU的操作;第二个原因是需要分配
父游标和子游标到库缓存中,由于库缓存是所有会话共享的,因此库缓存的内存分配必须串行执行。
在实际操作中,为了分配父游标和子游标,需要取得共享池的锁。


例:
SELECT * FROM t WHERE n=1234;
select * from t where n=1234;
SELECT  * FROM t WHERE n=1234;
这三条语句不会共享父游标,因为大小写和空格不一致的关系。


例:
ALTER SESSION SET optimizer_mode=all rows;
select * from t;


ALTER SESSION SET optimizer_mode=first_rows_10;
select * from t;


这两条语句的子游标也不会被共享,因为执行环境发生了变化。值得注意的时,它们仍然使用同一个执行计划。

所以与父游标相关的SQL文本,与子游标相关的时执行计划和执行环境。而硬解析通常是由不可共享的父游标导致,而在不使用绑定变量以及动态SQL语句时硬解析就无法避免。



参考资料:ORACLE性能诊断艺术

你可能感兴趣的:(oracle)