编码硬解析的改进方法1.

更改参数cursor_sharing参数cursor_sharing决定了何种类型的SQL能够使用相同的SQL areaCURSOR_SHARING = { SIMILAR | EXACT | FORCE }


EXACT --只有当发布的SQL语句与缓存中的语句完全相同时才用已有的执行计划。

FORCE --如果SQL语句是字面量,则迫使Optimizer始终使用已有的执行计划,无论已有的执行计划是不是                         最佳的。

SIMILAR --如果SQL语句是字面量,则只有当已有的执行计划是最佳时才使用它,如果已有执行计划不是   最佳则重新对这个SQL--语句进行分析来制定最佳执行计划。



当用户发出sql语句,oracle会根据该sql的文本信息:sql text生成的hash_value or sql_id(10g)去shared_pool中去

寻找是否有相同的sql,如果没有,则为该sql语句生成一个父游标(father cursor)和一个子游标(child cursor).  

父游标和v$sqlarea关联, 该视图的每一行表示了一个父游标,其中的version_count这一列表示该父游

标含有对应的子游标的个数,父游标包含的信息主要是sql text。  子游标和v$sql关联,该视图的每一行表示了一

个子游标,子游标包含的信息主要是该sql语句执行的环境信息,如执行计划等.  如果要共享父子游标,实现软解

析,在父游标可以共享,即sql的文本完全相同的情况下,能否实现共享取决于子游标,即sql的执行环境。不能

共享(mismatch)的信息可以在v$sql_shared_cursor这个视图中看到,

比较常见的情况有:  

1. optimizer_mismatch: 即优化器的模式不同,比如设置成all_rows, first_row(n)  

2. transaction_mismatch: 事务不同,如不同的用户在相同的其他条件下执行完全相同的sql语句

3. auth_mismatch : 授权不同, 同上  

4. bind_mismatch : 绑定变量不同,很典型的情况是变量的长度发生了变化.