[20171019]关于光标共享问题.txt

--//如果sql语句光标不能共享,查看v$sql_shared_cursor视图.
--//别人问的问题,如果存在两个因素是否显示2个原因.自己还是测试看看.

1.环境:
SCOTT@test01p> @ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.1.0.1.0     Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@test01p> create table t (c1 varchar2(4000));
Table created.

2.测试:
--//参考链接: http://blog.itpub.net/267265/viewspace-1993495/

SCOTT@test01p> variable instring varchar2(32)
SCOTT@test01p> exec :instring := rpad('X',1);
PL/SQL procedure successfully completed.

SCOTT@test01p> Select count(*) from t where c1=:instring;
  COUNT(*)
----------
         0

--//最好执行多次,确定sql_id=9msm2r8u8fv55.

SCOTT@test01p> show parameter optimizer_index_cost_adj
NAME                     TYPE    VALUE
------------------------ ------- -----
optimizer_index_cost_adj integer 100

SCOTT@test01p> alter session set optimizer_index_cost_adj=99;
Session altered.

SCOTT@test01p> variable instring varchar2(200)
SCOTT@test01p> exec :instring := rpad('X',33);
PL/SQL procedure successfully completed.

SCOTT@test01p> Select count(*) from t where c1=:instring;
  COUNT(*)
----------
         0
--//最好执行多次.

SCOTT@test01p> select sql_id, child_number, executions  from v$sql where sql_id = '9msm2r8u8fv55';
SQL_ID        CHILD_NUMBER EXECUTIONS
------------- ------------ ----------
9msm2r8u8fv55            0          7
9msm2r8u8fv55            1          5

--//可以发现产生2个子光标.

3.查询为什么不能共享原因:

SCOTT@test01p> @ share 9msm2r8u8fv55
old  15:           and q.sql_id like ''&1''',
new  15:           and q.sql_id like ''9msm2r8u8fv55''',
SQL_TEXT                       = Select count(*) from t where c1=:instring
SQL_ID                         = 9msm2r8u8fv55
ADDRESS                        = 000007FF1FD516B0
CHILD_ADDRESS                  = 000007FF12E68290
CHILD_NUMBER                   = 0
REASON                         = <ChildNode><ChildNumber>0</ChildNumber><ID>3</ID><reason>Optimizer mismatch(12)</reason><size>2x312</size><optimizer_index_cost_adj> 100   99 </optimizer_index_cost_adj></ChildNode>
--------------------------------------------------
SQL_TEXT                       = Select count(*) from t where c1=:instring
SQL_ID                         = 9msm2r8u8fv55
ADDRESS                        = 000007FF1FD516B0
CHILD_ADDRESS                  = 000007FF1268F890
CHILD_NUMBER                   = 1
OPTIMIZER_MISMATCH             = Y
REASON                         =
--------------------------------------------------

PL/SQL procedure successfully completed.

SCOTT@test01p> @ bind_cap 9msm2r8u8fv55 ''
C200
--------------------------------------------
Select count(*) from t where c1=:instring

SQL_ID        CHILD_NUMBER WAS NAME                   POSITION MAX_LENGTH LAST_CAPTURED       DATATYPE_STRING VALUE_STRING
------------- ------------ --- -------------------- ---------- ---------- ------------------- --------------- -----------------------------
9msm2r8u8fv55            0 YES :INSTRING                     1         32 2017-10-19 21:19:19 VARCHAR2(32)    X
                         1 YES :INSTRING                     1       2000 2017-10-19 21:20:07 VARCHAR2(2000)  X

--//可以发现这样不共享原因的原因是OPTIMIZER_MISMATCH.并没有包括BIND_LENGTH_UPGRADEABLE.
--//可以参考http://blog.itpub.net/267265/viewspace-746524/.

4.继续测试:
SCOTT@test01p> alter system flush shared_pool;
System altered.

declare
v_c1 varchar2(4000);
  begin
   for i in 1..4000 loop
     v_c1 := rpad('X',i);
     execute immediate 'select count(*) from t where c1=:instring' using v_c1 ;
    end loop;
end;
/

SCOTT@test01p> @ share 9mrd273576n14
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF12A095D0
CHILD_NUMBER                   = 0
REASON                         = <ChildNode><ChildNumber>0</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>32</original_oacmxl><upgradeable_new_oacmxl>128</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF126C6028
CHILD_NUMBER                   = 1
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>1</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>128</original_oacmxl><upgradeable_new_oacmxl>32</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF117CF2B8
CHILD_NUMBER                   = 2
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>2</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>2000</original_oacmxl><upgradeable_new_oacmxl>4000</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF12901EA0
CHILD_NUMBER                   = 3
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>3</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>4000</original_oacmxl><upgradeable_new_oacmxl>2000</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
PL/SQL procedure successfully completed.

SCOTT@test01p> alter session set optimizer_index_cost_adj=90;
Session altered.

declare
v_c1 varchar2(4000);
  begin
   for i in 1..4000 loop
     v_c1 := rpad('X',i);
     execute immediate 'select count(*) from t where c1=:instring' using v_c1 ;
    end loop;
end;
/

SCOTT@test01p> @ share 9mrd273576n14
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF12A095D0
CHILD_NUMBER                   = 0
REASON                         = <ChildNode><ChildNumber>0</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>32</original_oacmxl><upgradeable_new_oacmxl>128</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF126C6028
CHILD_NUMBER                   = 1
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>1</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>128</original_oacmxl><upgradeable_new_oacmxl>32</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF117CF2B8
CHILD_NUMBER                   = 2
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>2</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>2000</original_oacmxl><upgradeable_new_oacmxl>4000</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF12901EA0
CHILD_NUMBER                   = 3
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>3</ChildNumber><ID>3</ID><reason>Optimizer mismatch(12)</reason><size>2x312</size><optimizer_index_cost_adj> 100                  90
</optimizer_index_cost_adj></ChildNode><ChildNode><ChildNumber>3</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>4000</original_oacmxl><upgradeable_new_oacmxl>2000</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF1199A5B0
CHILD_NUMBER                   = 4
OPTIMIZER_MISMATCH             = Y
REASON                         = <ChildNode><ChildNumber>4</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>32</original_oacmxl><upgradeable_new_oacmxl>128</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF11462050
CHILD_NUMBER                   = 5
OPTIMIZER_MISMATCH             = Y
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>5</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>128</original_oacmxl><upgradeable_new_oacmxl>32</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF1197B738
CHILD_NUMBER                   = 6
OPTIMIZER_MISMATCH             = Y
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>6</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>2000</original_oacmxl><upgradeable_new_oacmxl>4000</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
SQL_TEXT                       = select count(*) from t where c1=:instring
SQL_ID                         = 9mrd273576n14
ADDRESS                        = 000007FF11975C18
CHILD_ADDRESS                  = 000007FF148FDB10
CHILD_NUMBER                   = 7
OPTIMIZER_MISMATCH             = Y
BIND_LENGTH_UPGRADEABLE        = Y
REASON                         = <ChildNode><ChildNumber>7</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>4000</original_oacmxl><upgradeable_new_oacmxl>2000</upgradeable_new_oacmxl></ChildNode>
--------------------------------------------------
PL/SQL procedure successfully completed.

--//注意看:CHILD_NUMBER = 4,OPTIMIZER_MISMATCH= Y.视乎于CHILD_NUMBER = 3进行比较.
--//看CHILD_NUMBER = 3的REASON
REASON = <ChildNode><ChildNumber>3</ChildNumber><ID>3</ID><reason>Optimizer mismatch(12)</reason><size>2x312</size><optimizer_index_cost_adj> 100                  90
</optimizer_index_cost_adj></ChildNode><ChildNode><ChildNumber>3</ChildNumber><ID>40</ID><reason>Bind
mismatch(22)</reason><size>4x4</size><bind_position>0</bind_position><original_oacflg>19</original_oacflg><original_oacmxl>4000</original_oacmxl><upgradeable_new_oacmxl>2000</upgradeable_new_oacmxl></ChildNode>

SCOTT@test01p> @ bind_cap 9mrd273576n14 ''
C200
-----------------------------------------------------------------------------------------------------------------------------------
select count(*) from t where c1=:instring

SQL_ID        CHILD_NUMBER WAS NAME                   POSITION MAX_LENGTH LAST_CAPTURED       DATATYPE_STRING VALUE_STRING
------------- ------------ --- -------------------- ---------- ---------- ------------------- --------------- ---------------------
9mrd273576n14            0 YES :INSTRING                     1         32 2017-10-19 21:34:51 VARCHAR2(32)    X
                         1 YES :INSTRING                     1        128 2017-10-19 21:34:51 VARCHAR2(128)   X
                         2 YES :INSTRING                     1       2000 2017-10-19 21:34:51 VARCHAR2(2000)  X

4 YES :INSTRING                     1         32 2017-10-19 21:36:02 VARCHAR2(32)    X
                         5 YES :INSTRING                     1        128 2017-10-19 21:36:02 VARCHAR2(128)   X
                         6 YES :INSTRING                     1       2000 2017-10-19 21:36:02 VARCHAR2(2000)  X
--//缺少CHILD_NUMBER=3,主要超出了抓取字符串限制.
--//还是看不出什么规律,放弃.

--//附上脚本:
$ cat share.sql

SET  serveroutput on size  1000000;

DECLARE
   c           NUMBER;
   col_cnt     NUMBER;
   col_rec     DBMS_SQL.desc_tab;
   col_value   VARCHAR2 (4000);
   ret_val     NUMBER;
BEGIN
   c := DBMS_SQL.open_cursor;
   DBMS_SQL.parse
      (c,
       'select q.sql_text, s.*
      from v$sql_shared_cursor s, v$sql q
      where s.sql_id = q.sql_id
          and s.child_number = q.child_number
          and q.sql_id like ''&1''',
       DBMS_SQL.native
      );
   DBMS_SQL.describe_columns (c, col_cnt, col_rec);

FOR idx IN 1 .. col_cnt
   LOOP
      DBMS_SQL.define_column (c, idx, col_value, 4000);
   END LOOP;

ret_val := DBMS_SQL.EXECUTE (c);

WHILE (DBMS_SQL.fetch_rows (c) > 0)
   LOOP
      FOR idx IN 1 .. col_cnt
      LOOP
         DBMS_SQL.COLUMN_VALUE (c, idx, col_value);

IF col_rec (idx).col_name IN
               ('SQL_ID', 'ADDRESS', 'CHILD_ADDRESS', 'CHILD_NUMBER',
                'SQL_TEXT','REASON')
         THEN
            DBMS_OUTPUT.put_line (   RPAD (col_rec (idx).col_name, 30)
                                  || ' = '
                                  || col_value
                                 );
         ELSIF col_value = 'Y'
         THEN
            DBMS_OUTPUT.put_line (   RPAD (col_rec (idx).col_name, 30)
                                  || ' = '
                                  || col_value
                                 );
         END IF;
      END LOOP;

DBMS_OUTPUT.put_line
                         ('--------------------------------------------------');
   END LOOP;

DBMS_SQL.close_cursor (c);
END;
/

SET serveroutput off;

$cat bind_cap.sql
set verify off
column value_string format a50
column datatype_string format a15
break on sql_id on child_number  skip 1
select  replace(sql_fulltext,chr(13),'') c200 from v$sql where sql_id='&1' and rownum<=1;

SELECT sql_id,
       child_number,
       was_captured,
       name,
       position,
       max_length,
       last_captured,
       datatype_string,
       DECODE (
          datatype_string,
          'DATE', TO_CHAR (TO_DATE (value_string, 'mm/dd/yy hh24:mi:ss'),
                           'yyyy/mm/dd hh24:mi:ss'),
          value_string)
          value_string
  FROM v$sql_bind_capture
 WHERE sql_id = '&1' and was_captured='YES' and  DUP_POSITION is null and name=nvl('&&2',name)
 order by child_number,was_captured,position;
break on sql_id on child_number  skip 0

[20171019]关于光标共享问题.txt相关推荐

  1. [20161219]关于LANGUAGE_MISMATCH.txt

    [20161219]为什么光标不共享(LANGUAGE_MISMATCH).txt --生产系统看看那种情况出现比较多,写一个脚本: select sum(decode(UNBOUND_CURSOR, ...

  2. 试图共享文件夹时出现错误,没有启动服务器服务,此时尚未创建共享资源,试图共享时出现错误,没有启动服务器服务,此时尚未创建共享资源...

    试图共享时出现错误,没有启动服务器服务,此时尚未创建共享资源.txt 1.如果"文件打印和共享"协议已安装,但在需要共享的文件夹上单击右键没有"共享"菜单.解决 ...

  3. 取消管理员取得所有权_win7管理员取得所有权批处理 - 卡饭网

    给力Windows XP如何添加"管理员取得所有权"右键菜单 给力Windows XP如何添加"管理员取得所有权"右键菜单 如果WinXP也能添加这个功能多好啊 ...

  4. JS 基础事件的用法

    // 1.9以上用on// 案例一// $('#btn').on('click', function(){// //console.log(1);// alert('测试...');// });// ...

  5. 讯飞输入法 语音识别功能 台式机设置

    官网下载window版本讯飞输入法 官网链接:https://srf.xunfei.cn/ 1.电脑声音设置(台式机) 没有外界音响的需要先设置扬声器,在电脑机箱背板将有线耳机插入扬声器接口(我的是绿 ...

  6. PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1

    ※★◆● PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1 AApprriill 22001166 Co ...

  7. [20170711]关于tmux共享会话问题.txt

    [20170711]关于tmux共享会话问题.txt --//星期6,7看了一些tmux相关数据,学习如何共享会话,老外给它起一个很好听的名字叫做结对编程(Pair Programming). --/ ...

  8. 如何查询oracle的共享内存,[20190104]ipcs查看共享内存段.txt

    [20190104]ipcs查看共享内存段.txt --//数据库启动异常,有时候会留下一些共享内存段没有清理,需要使用ipcrm清理. --//由于服务器上跑2个实例,必须选择正确的共享内存段,否则 ...

  9. [20160201]db_link与子光标问题.txt

    [20160201]db_link与子光标问题.txt --生产系统遇到一个关于db_link产生大量子光标问题,当cursor_sharing=force的情况下,通过测试说明. --注:这个问题我 ...

最新文章

  1. CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)
  2. mybatis 一二事(1) - 简单介绍
  3. 【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 )
  4. 054_Unicode字符官方标准五
  5. 人工智能对金融世界的改变_人工智能革命正在改变网络世界
  6. Tensorflow基础语法和概念
  7. a标签 href和onclick 传递的this区别
  8. 站立会议01(冲刺2)
  9. linux系统下的打印机驱动下载,foo2zjs linux环境下打印机驱动源代码 - 下载 - 搜珍网...
  10. UI设计和前端开发的区别
  11. 自己用JavaScript写出吉他和弦图生成器
  12. 单链表———带头结点跟不带头结点的区别
  13. 利用 yaml-cpp 开源库读写 yaml 配置文件—— 读写部分
  14. 【基础知识】BSS段,数据段,代码段,堆栈段
  15. 帝国CMSH5小游戏模板帝国CMS内核游戏整站源码
  16. Linux释放内存及手动释放Oracle共享内存段
  17. 计算机显示器模糊,电脑显示器模糊的原因和解决方法【图文】
  18. 鸟哥的linux私房菜运维篇,鸟哥的Linux私房菜学习笔记之SAMBA
  19. 【毕业设计】后端实现——设计数据库并存储数据
  20. go语言 declared and not used

热门文章

  1. 7.20王者荣耀导航栏1
  2. 边学边思考——数据库中函数依赖与多值依赖的辨析
  3. restful风格接口
  4. 快微摄影定制版v1.6.6
  5. 线性代数 第三章 向量与向量空间 知识点总结(Jeff自我感悟)
  6. 怎么恢复微信删除的聊天记录?如何恢复微信删除内容
  7. 准确率(Accuracy)、精度(Precision)、召回率(Recall)和 mAP 的图解
  8. 程序员如果都懂SpringWebFlux框架的话,也不用天天CRUD了
  9. 5G时代下的室内定位导航逐渐精准--蓝牙定位--新导智能
  10. 云数据库没有公网ip如何访问,navicate ssh隧道 + com.jcraft.jsch