首页 > 代码库 > 11g新特性之自适应游标共享(Adaptive Cursor Sharing)

11g新特性之自适应游标共享(Adaptive Cursor Sharing)

自适应游标共享会使包含绑定变量的单个语句拥有多个执行计划,所谓自适应是指执行计划会依据绑定变量的具体值而适配一个最适合该值的执行计划。

 隐藏参数_optimizer_adaptive_cursor_sharing=TRUE 开启或关闭此特性。

首先:游标是否可以被ACS使用,首先游标必须是绑定变量敏感的游标,也就是说最优的执行计划会依赖于绑定变量具体的值。数据库会监控绑定变量敏感的游标,观察是否不同的执行计划会对不同的绑定变量值有好处。

游标在以下两个条件满足的时候会被标记为绑定变量敏感的游标:

1.优化器通过绑定变量窥测去做选择性评估。

2.在绑定变量的列上存在直方图信息。

。。。

对于传入的每个新的游标的具体值,数据库会记录语句执行时的统计信息,语句执行完后,数据库会对比这次执行的统计信息与之前执行的统计信息,如果两者差距很大,则数据库会将该游标标记为 bind-aware 的游标。

当一个游标被标记为 bind-aware的游标后,只要绑定变量的值落入之前收集的绑定变量值与选择率的直方图内,优化器就会重用一个已经存在并且对该绑定变量来说最优的执行计划,如果绑定变量的值没有落入上述直方图内,则会进行硬解析,由此可见,自适应游标共享的好处是既减少了硬解析的次数,对于不同的绑定变量值来说又能找到一个合适它的执行计划。

游标合并:

当优化器创建新的执行计划为 bind-aware的游标后,如果该执行计划和一个已经存在的游标相同的时候,在这种情况下,优化器会合并游标去节省内存空间,数据库会扩大选择性范围去包括新的绑定变量值的选择性。

游标共享相关的性能视图:

  • V$SQL 去检查一个游标是否是 bind-sensitive 以及bind-aware的游标。

  • V$SQL_CS_HISTOGRAM 有绑定变量,选择性,执行次数的直方图。

  • V$SQL_CS_SELECTIVITY 包括绑定变量对选择性范围。

  • V$SQL_CS_STATISTICS summarizes 包括优化器是否将某个游标标记为bind_aware 的统计信息。
SQL> var v_own varchar2(100);
SQL> exec :v_own=‘sys‘;
begin :v_own=‘sys‘; end;
ORA-06550: line 1, column 13:
PLS-00103: Encountered the symbol "=" when expecting one of the following:

   := . ( @ % ; indicator
The symbol ":= was inserted before "=" to continue.
v_own
---------

SQL> exec :v_own:=‘sys‘;
PL/SQL procedure successfully completed
v_own
---------
sys

SQL>select count(distinct 

  

11g新特性之自适应游标共享(Adaptive Cursor Sharing)