设置共享游标的属性
在客户想Oracle提交SQL后,Oracle将把该SQL的正文与共享池中现有的语句进行比较,以确定是否能够使用共享池中现成的
、被解析过的语句。如果找不到SQL文本严格匹配的SQL,则Oracle不共享该语句。
在Oracle 10g/11g版本中,我们可以通过参数CURSOR_SHARING 调整这个属性。在该参数设置为SIMILAR或FORCE得情况下,
Oracle将首先检查共享池中是否存在相同的语句,如果相同的语句没有找到,那么Oracle将在共享池中搜索结构类似的语句。
如果类似的语句可以找到,则Oracle将进行语法分析和检查,以认证该语句的解析结果和编译结果可被使用。如果上述过程
全部失败,则Oracle进行硬语法解析,产生SQL执行计划及编译,这就产生了我们不愿意看到的硬解析。
因此,这里关键是SQL语句的类似程度。如果SQL语句是一致的,但表示条件、数量的一些关键文字不一样,就被称为类似语句。
类似语句在参数CURSOR_SHARING 设置为SIMILAR或FORCE的情况下将跳过文本检查,继续后面的解析过程以确保执行计划和原SQL语句的
一致性。
CURSOR_SHARING参数的默认值为EXACT,这就是说,只有当SQL的正文能够完全匹配共享SQL区域中的SQL时,这种SQL语句才是共享
的,即共用执行计划和编译结果:
SQL>show parameter CURSOR_SHARING
NAME TYPE VALUE
---------------------------- --------------------- ---------
curor_sharing string EXACT
显然,CURSOR_SHARING的设计能够解决一些和SQL解析相关的性能问题。它有下列的参考值:FORCE、SIMILAR、EXACT(默认)。
下面的语句将CURSOR_SHARING参数设置为SIMILAR:
SQL>alter system set CURSOR_SHARING=SIMILAR SCOPE=BOTH;
一般情况下 CURSOR_SHARING 参数不设置为 FORCE,因为这带有强制性的含义,它可能使Oracle不得不采用共享池中并非优化的
执行计划。
总体说来,调整CURSOR_SHARING 参数并非最佳手段,而且在实践上该参数也可能带来一些意外的效果--严格的工程测试是绝对必要的!