说到软解析(soft prase )和硬解析( hard prase ),就不能不说一下 Oracle 对 sql 的处理过程。当你发出一条 sql 语句交付 Oracle ,在执行和获取结果前, Oracle 对此 sql 将进行几个步骤的处理过程:
1、语法检查( syntax check )
检查此sql 的拼写是否语法。
2、语义检查( semantic check )
诸如检查sql 语句中的访问对象是否存在及该用户是否具备相应的权限。
3、对 sql 语句进行解析( prase )
利用内部算法对sql 进行解析,生成解析树( parse tree )及执行计划( execution plan )。
4、执行 sql ,返回结果( execute and return )
其中,软、硬解析就发生在第三个过程里。
Oracle利用内部的 hash 算法来取得该 sql 的 hash 值,然后在 library cache 里查找是否存在该 hash 值;
假设存在,则将此sql 与 cache 中的进行比较;
假设“ 相同 ” ,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。
诚然,如果上面的2 个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。
创建解析树、生成执行计划对于sql 的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。
这就是在很多项目中,倡导开发设计人员对功能相同的代码要努力保持代码的一致性,以及要在程序中多使用绑定变量的原因。
/****************************************************/
大家都在说在Sql 中使用了 Bind Var (绑定变量)会提高不少性能,那他到底是如何提高性能的呢?
使用了Bind Var 能提高性能主要是因为这样做可以尽量避免不必要的硬分析( Hard Parse )而节约了时间,同时节约了大量的 CPU 资源。
当一个Client 提交一条 Sql 给 Oracle 后, Oracle 首先会对其进行解析( Parse ),然后将解析结果提交给优化器( Optimiser )来进行优化而取得 Oracle 认为的最优的 Query Plan ,然后再按照这个最优的 Plan 来执行这个 Sql 语句(当然在这之中如果只需要软解析的话会少部分步骤)。
但是,当Oracle 接到 Client 提交的 Sql 后会首先在共享池( Shared Pool )里面去查找是否有之前已经解析好的与刚接到的这一个 Sql 完全相同的 Sql (注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的 Sql 在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗的 CPU 资源。尤其是在 OLTP 中运行着的大量的短小 Sql ,效果就会比较明显了。因为一条两条 Sql 的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。
上面说到了硬解析(Hard Parse ),那这个 Hard Parse 到底是个啥呢?
Parse主要分为三种:
1、 Hard Parse (硬解析)
2、 Soft Parse (软解析)
3、 Soft Soft Parse (好像有些资料中并没有将这个算在其中)
Hard Parse就是上面提到的对提交的 Sql 完全重新从头进行解析(当在 Shared Pool 中找不到时候将会进行此操作),总共有一下 5 个执行步骤:
1:语法分析
2:权限与对象检查
3:在共享池中检查是否有完全相同的之前完全解析好的 — 如果存在,直接跳过 4 和 5 ,运行 Sql (此时算 soft parse )
4:选择执行计划
5:产生执行计划
Soft Parse就如果是在 Shared Pool 中找到了与之完全相同的 Sql 解析好的结果后会跳过 Hard Parse 中的后面的两个步骤。
Soft Soft Parse实际上是当设置了 session_cursor_cache 这个参数之后, Cursor 被直接 Cache 在当前 Session 的 PGA 中的,在解析的时候只需要对其语法分析、权限对象分析之后就可以转到 PGA 中查找了,如果发现完全相同的 Cursor ,就可以直接去取结果了,也就就是实现了 Soft Soft Parse.
本文转自:http://blog.csdn.net/tianlesoftware/archive/2009/10/29/4743971.aspx