cursor_sharing设置为similar 的弊端

将cursor_sharing设置为similar会产生许多问题:
1、对于语句中包含的范围查询(如between, <, !=)或者所捆绑的列中进行直方图统计不适合使用;
2、影响11g Adaptive Cursor sharing特性和CBO优化器
3、Similar可能产生的一个父游标, 多个子游标,其性能比多个父游标情况更加糟
糕(EXACT或 FORCE);
对于第一个,我们做实验如下:
1 修改参数,建表,统计信息
yang@rac1>alter session set cursor_sharing=similar;
Session altered.
yang@rac1>create table t_cur_sh as
  2  select rownum id ,
  3  dbms_random.string('s',12) val
  4  from dual
  5  connect by level <1e3;
Table created.
yang@rac1>begin
  2  dbms_stats.gather_table_stats(
  3   user,
  4  'T_CUR_SH',
  5  cascade=>true,
  6  estimate_percent=>null,
  7  method_opt=>'for all columns size 1');
  8  end;
  9  /
PL/SQL procedure successfully completed.
2 进行等值测试
yang@rac1>@/tmp/t.sql
select /*+yang */ count(1) from t_cur_sh where id=1;
select /*+yang */ count(1) from t_cur_sh where id=2;
select /*+yang */ count(1) from t_cur_sh where id=3;
select /*+yang */ count(1) from t_cur_sh where id=4;
select /*+yang */ count(1) from t_cur_sh where id=5;
select /*+yang */ count(1) from t_cur_sh where id=6;
select /*+yang */ count(1) from t_cur_sh where id=7;
select /*+yang */ count(1) from t_cur_sh where id=8;
select /*+yang */ count(1) from t_cur_sh where id=9;
select /*+yang */ count(1) from t_cur_sh where id=10;
--查看子游标的信息:现在是2个子游标
select count(hash_value) copies,
 substrb(sql_text,1,80) sql_text
from v$sql
where substrb(sql_text,1,80) like '%yang%'
group by substrb(sql_text,1,80)
order by copies asc
/
    COPIES SQL_TEXT
---------- --------------------------------------------------------------------------------
         2 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"

yang@rac1>select        
  2          hash_value, IS_OBSOLETE,
  3          IS_BIND_SENSITIVE,
  4          IS_SHAREABLE,
  5          substrb(SQL_TEXT,1 ,80) SQL_TEXT
  6    from v$sql
  7    where substrb(sql_text,1,80) like '%yang%';
HASH_VALUE I I I SQL_TEXT
---------- - - ------------------------------------------------------------
3475970911 N N Yselect /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3475970911 N N Yselect /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
上面三个 I 分别是:
是否绑定敏感(is_bind_sensitive):不仅指出是否使用绑定变量窥测来生成执行计划,而且指出这个执行计划是否依赖于窥测到的值。如果是,这个字段会被设置为Y,否则会被设置为N。
是否绑定可知(is_bind_aware):表明游标是否使用了扩展的游标共享。如果是,这个字段会被设置为Y,如果不是,这个字段会被设置为N。如果是设置为N,这个游标将被废弃,不再可用。
是否可共享(is_shareable):表明游标能否被共享。如果可以,这个字段会被设置为Y,否则,会被设置为N。如果被设置为N,这个游标将被废弃,不再可用
这里
IS_OBSOLETE = N
IS_BIND_SENSITIVE=N
IS_SHAREABLE=Y  --游标是可以共享的。
再看一个例子:不等值的情况下使用 similar的情况:
yang@rac1>@/tmp/t2.sql
t2.sql
select /*+yang */ count(1) from t_cur_sh where id<2;
select /*+yang */ count(1) from t_cur_sh where id<3;
select /*+yang */ count(1) from t_cur_sh where id<4;
select /*+yang */ count(1) from t_cur_sh where id<5;
select /*+yang */ count(1) from t_cur_sh where id<6;
select /*+yang */ count(1) from t_cur_sh where id<7;
select /*+yang */ count(1) from t_cur_sh where id<8;
select /*+yang */ count(1) from t_cur_sh where id<9;
select /*+yang */ count(1) from t_cur_sh where id<10;

select count(hash_value) copies,
 substrb(sql_text,1,80) sql_text
from v$sql
where substrb(sql_text,1,80) like '%yang%'
group by substrb(sql_text,1,80)
order by copies asc
/
COPIES SQL_TEXT
---------- -------------------------------------------------------------------------------
2 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
9 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1" --结果是 9个子游标
没有充分共享,所以在范围查询和直方图统计中不适合设置similar,
yang@rac1>select        
  2          hash_value, IS_OBSOLETE,
  3          IS_BIND_SENSITIVE,
  4          IS_SHAREABLE,
  5          substrb(SQL_TEXT,1 ,80) SQL_TEXT
  6    from v$sql
  7    where substrb(sql_text,1,80) like '%yang%';

HASH_VALUE I I I  SQL_TEXT
---------- - - -------------------------------------------------------------------
3475970911 N N Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3475970911 N N Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:"SYS_B_1"
11 rows selected.
IS_OBSOLETE = N
IS_BIND_SENSITIVE=N --不敏感,如果是设置为N,这个游标将被废弃,不再可用。
IS_SHAREABLE=Y   

时间: 2025-01-15 01:24:49

cursor_sharing设置为similar 的弊端的相关文章

参数cursor_sharing的解释

这个参数的设置,oracle是为了满足一些以前开发的程序,里面有大量的similar statement,但是重写有不现实的情况下使用的一个参数.并且oracle也不建议使用这个参数. 什么时候需要修改这个参数呢?需要满足以下的条件.一个是由于大量的shared pool hit miss影响了用户的响应时间(就是当前的shared pool无法满足共享sql语句存储的需要,Alan:当前libary cache中没有我们所需要重用的explain和sql),如果没有这个问题,那么设置这个参数,

High Version Count(高版本游标)数目过多诊断的方法

High Version Count(高版本游标)数目过多诊断的方法  什么是high version cursor(高版本游标)? 对于一个特定的游标有多少个版本就属于高版本游标是没有明确定义的.对于不同的系统有不同的数量界定.然而在awr报告中对于一个父游标超过20个子游标个数时就会被报告出来 然而当一个游标的版本数据达到成百上千,那么这些绝对是高版本游标.所以要检查这些sql有高版本的原因要尽量使用这些sql能够被共享. 什么是共享sql? 首先要记住的是所有sql语句都是式共享的.当一个

[20130313]cursor_sharing=force的问题.txt

[20130313]cursor_sharing=force的问题.txt 前一阵子,我把生产系统的cursor_sharing设置为force, 大概按照链接: http://space.itpub.net/267265/viewspace-754003 我发现一个奇怪的问题,自己在测试环境重复测试看看. 1.建立测试环境: SQL> select * from v$version where rownum BANNER ------------------------------------

ursor_sharing=SIMILAR 引发大量的 cursor: mutex S

今天一个朋友的数据库11.2.0.1 遇到这个问题,导致业务大面积的瘫痪查看等待如下:   IN_NUM EVENT_NAME                                                       NOW_SNAP_ID NOW_WAITED_TOTAL WAIT_TIME_MICRO    ROW_NUM ---------- ---------------------------------------------------------------- 

Oracle中的游标、硬解析、软解析、软软解析、解析失败

Oracle中的游标.硬解析.软解析.软软解析.解析失败 一. 游标的分类及共享游标 游标(Cursor)是Oracle数据库中SQL解析和执行的载体,它可以分为共享游标(Shared Cursor)和会话游标(Session Cursor).共享游标可以细分为父游标(Parent Cursor)和子游标(Child Cursor),可以通过视图V$SQLAREA和V$SQL来查看当前缓存在库缓存(Library Cache)中的父游标和子游标,其中V$SQLAREA用于查看父游标,V$SQL用

Oracle游标共享(Cursor Sharing)--常规游标共享和自适应游标共享(ACS)

Oracle游标共享(Cursor Sharing)--常规游标共享和自适应游标共享(ACS) 游标共享(Cursor Sharing)是指Shared Cursor间的共享,其实就是重用存储在Child Cursor中的解析树和执行计划而不用从头开始做硬解析的动作.特别对于除SQL文本中对应的输入值不同外,其它部分都一模一样的目标SQL更应该实现游标共享,而使用绑定变量就可以实现游标共享. 很多OLTP类型的应用系统的开发人员在开发阶段并未意识到硬解析的危害,所以也没有使用绑定变量,等到系统上

《Oracle高性能自动化运维》一一2.3 Library Cache

2.3 Library Cache2.3.1 Library Cache与SQL游标 Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低.性能最优. 1. SQL语句与父游标及子游标 在PL/SQL中,游标(Cursor)是数据集遍历的内存集合.而从广义上讲,游标是SQL语句在Library Cache中的内存载体.SQL语句与游标关系如下: 1)一条SQL语句包含一个父游标(Parent Cursor)和

Oracle 性能相关的几个 视图 和 参数

原文转自:http://blog.csdn.net/tianlesoftware/article/details/5867276 一.性能视图          性能视图是Oracle中一些记录数据库性能方面的视图,通过查看这些视图,获得数据库当前或历史上某个时间的性能数据. 它比SQL_TRACE,AWR报告获取数据更及时,便捷. 1.1 V$SQL          V$SQL 视图是一个DBA 使用频率非常高的动态视图,它通常和V$SESSION 一起使用来获得当前会话的一些SQL执行情况

Library Cache优化与SQL游标

Dear 跟着小编一起读好书运动开始啦!咱们作为DBA不仅要外部打扮自己,更要从内部武装.近期,小编将分享冷菠老师的<Oracle高性能自动化运维>一部分精选章节分享给大家.如果你对内容很感兴趣,还是要去买一本比较好哦. 冷菠 冷菠,网名悠然(个人主页http://www.orasky.net ),资深DBA,著有<Oracle高性能自动化运维>,有近10年的数据库运维.团队管理以及培训经验.曾担任美资企业Senior DBA职务.支付公司数据库团队负责人,现为培训机构重庆优唯佳科