Oracle自适应游标共享(Adaptive Cursor Sharing)

1、自适应游标说明

    在Oracle 10g 和11g中对绑定变量的处理,已经有所不同, 在Oracle 10g中,绑定变量相对比较简单,当使用绑定变量的SQL 第一次执行时,会进行硬解析,生成plan 和cursor。 在这个过程中,Oracle 会使用bind peeking,即将绑定变量的值带入,从而选择最优的一个plan。以后每次执行都使用这个plan。
    在以后的执行时,如果因为其他原因导致cursor 不可重用,那么就会生成一个child_cursor. 这个cursor 不可重用的原因可以查看:v$sql_shared_cursor视图。
    在Oracle 11g 以后在绑定变量这块有所以改变,会生成一个范围值的执行计划。然后每次传变量进去就对比范围,选择最优的执行计划。与这个功能相关的参数保存在v$sql视图中:is_bind_sensitive,is_bind_aware,is_shareable。这几个字段,在Oracle 10g的v$sql 视图里是没有的。
    IS_BIND_SENSITIVE:指示游标是否为对绑定敏感,值为YES | NO。符合以下情况的查询称为对绑定敏感的查询:计算谓词选择性时优化程序为其扫视绑定变量值,并且绑定变量值的更改可能导致不同计划。
    IS_BIND_AWARE:指示游标是否为能标识绑定的游标,值为YES | NO。游标高速缓存中已标记为使用能识别绑定的游标共享的游标称为能标识绑定的游标。

2、自适应游标共享功能与限制

Adaptive Cursor Sharing 作用如下:
• 通过自适应游标共享,可以仅针对使用绑定变量的语句智能地共享游标。
• 自适应游标共享用于协调游标共享和优化之间的矛盾。
• 自适应游标共享具有如下优点:
    – 自动检测不同执行受益于不同执行计划的时间
    – 将生成的子游标数限制到最小
    – 是自动机制,无法关闭

Oracle自适应游标共享(Adaptive Cursor Sharing)_第1张图片

限制
Oracle11gR2为止,ACS特性存在以下限制(当以下场景出现时,会导致ACS不会把游标标记为bind sensitive):
    • 扩展游标共享被关闭;
    • 查询中没绑定变量;
    • 某些参数被设置(例如:绑定变量窥探被置为flase);
    • 语句正使用并行查询时;
    • 语句使用了hints;
    • Outlines正被使用;
    • 查询为递归查询;
    • 绑定变量数超过14;

3、开启与关闭

ACS默认情况下是开启的,为了关闭ACS需要修改下列参数
alter system set "_optimizer_extended_cursor_sharing_rel"=none scope=spfile sid='*';
alter system set "_optimizer_extended_cursor_sharing"=none scope=spfile sid='*';
alter system set "_optimizer_adaptive_cursor_sharing"=false scope=spfile sid='*';
为了开启ACS需要确保下列参数有效
alter system set "_optim_peek_user_binds" =true  scope=spfile sid='*';
alter system set "_optimizer_adaptive_cursor_sharing" =TRUE  scope=spfile sid='*';
alter system set "_optimizer_extended_cursor_sharing" =UDO  scope=spfile sid='*';
alter system set "_optimizer_extended_cursor_sharing_rel" =SIMPLE  scope=spfile sid='*';
Ø  相关hint:Oracle11g中有个新的 hint,当使用此hint时,即使把ACS特性关掉,ACS特性在语句级依然会生效,该hint的语法为:/*+ BIND_AWARE*/;

实际生产中自适应游标的限制还是非常的多, 同时又较大的几率遇到SQL语句多版本问题,应发数据库故障,一般建议关闭此特性。

 

4、相关视图

V$SQL_CS_HISTOGRAM:显示跨三个存储桶执行历史记录直方图的执行计数的分布情况。
V$SQL_CS_SELECTIVITY:显示为包含绑定变量且在游标共享检查中使用了其选择性的每个谓词存储在游标中的选择性立方体或范围。它包含谓词文本和选择性范围的下限值和上限值。
V$SQL_CS_STATISTICS:自适应游标共享监视查询的执行,并在一段时间内收集相关的信息,使用此信息可确定是否切换到对该查询使用能识别绑定的游标。该视图汇总了所收集的信息以让您作出以下决定:对于执行示例,它跟踪已处理的行数、缓冲区获取数和CPU 时间。如果使用绑定集来构建游标,则PEEKED 列的值为YES,否则为NO。

MOS上对ACS的说明:
Adaptive Cursor Sharing in 11G[ID 836256.1]
Adaptive Cursor SharingOverview [ID 740052.1]

 

 

 

 

你可能感兴趣的:(Oracle)