[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相关推荐
- [20161219]关于LANGUAGE_MISMATCH.txt
[20161219]为什么光标不共享(LANGUAGE_MISMATCH).txt --生产系统看看那种情况出现比较多,写一个脚本: select sum(decode(UNBOUND_CURSOR, ...
- 试图共享文件夹时出现错误,没有启动服务器服务,此时尚未创建共享资源,试图共享时出现错误,没有启动服务器服务,此时尚未创建共享资源...
试图共享时出现错误,没有启动服务器服务,此时尚未创建共享资源.txt 1.如果"文件打印和共享"协议已安装,但在需要共享的文件夹上单击右键没有"共享"菜单.解决 ...
- 取消管理员取得所有权_win7管理员取得所有权批处理 - 卡饭网
给力Windows XP如何添加"管理员取得所有权"右键菜单 给力Windows XP如何添加"管理员取得所有权"右键菜单 如果WinXP也能添加这个功能多好啊 ...
- JS 基础事件的用法
// 1.9以上用on// 案例一// $('#btn').on('click', function(){// //console.log(1);// alert('测试...');// });// ...
- 讯飞输入法 语音识别功能 台式机设置
官网下载window版本讯飞输入法 官网链接:https://srf.xunfei.cn/ 1.电脑声音设置(台式机) 没有外界音响的需要先设置扬声器,在电脑机箱背板将有线耳机插入扬声器接口(我的是绿 ...
- PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1
※★◆● PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1 AApprriill 22001166 Co ...
- [20170711]关于tmux共享会话问题.txt
[20170711]关于tmux共享会话问题.txt --//星期6,7看了一些tmux相关数据,学习如何共享会话,老外给它起一个很好听的名字叫做结对编程(Pair Programming). --/ ...
- 如何查询oracle的共享内存,[20190104]ipcs查看共享内存段.txt
[20190104]ipcs查看共享内存段.txt --//数据库启动异常,有时候会留下一些共享内存段没有清理,需要使用ipcrm清理. --//由于服务器上跑2个实例,必须选择正确的共享内存段,否则 ...
- [20160201]db_link与子光标问题.txt
[20160201]db_link与子光标问题.txt --生产系统遇到一个关于db_link产生大量子光标问题,当cursor_sharing=force的情况下,通过测试说明. --注:这个问题我 ...
最新文章
- CodeForces - 1401 F Reverse and Swap(线段树, 区间翻转, 区间交换,清晰易懂)
- mybatis 一二事(1) - 简单介绍
- 【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 )
- 054_Unicode字符官方标准五
- 人工智能对金融世界的改变_人工智能革命正在改变网络世界
- Tensorflow基础语法和概念
- a标签 href和onclick 传递的this区别
- 站立会议01(冲刺2)
- linux系统下的打印机驱动下载,foo2zjs linux环境下打印机驱动源代码 - 下载 - 搜珍网...
- UI设计和前端开发的区别
- 自己用JavaScript写出吉他和弦图生成器
- 单链表———带头结点跟不带头结点的区别
- 利用 yaml-cpp 开源库读写 yaml 配置文件—— 读写部分
- 【基础知识】BSS段,数据段,代码段,堆栈段
- 帝国CMSH5小游戏模板帝国CMS内核游戏整站源码
- Linux释放内存及手动释放Oracle共享内存段
- 计算机显示器模糊,电脑显示器模糊的原因和解决方法【图文】
- 鸟哥的linux私房菜运维篇,鸟哥的Linux私房菜学习笔记之SAMBA
- 【毕业设计】后端实现——设计数据库并存储数据
- go语言 declared and not used
热门文章
- 7.20王者荣耀导航栏1
- 边学边思考——数据库中函数依赖与多值依赖的辨析
- restful风格接口
- 快微摄影定制版v1.6.6
- 线性代数 第三章 向量与向量空间 知识点总结(Jeff自我感悟)
- 怎么恢复微信删除的聊天记录?如何恢复微信删除内容
- 准确率(Accuracy)、精度(Precision)、召回率(Recall)和 mAP 的图解
- 程序员如果都懂SpringWebFlux框架的话,也不用天天CRUD了
- 5G时代下的室内定位导航逐渐精准--蓝牙定位--新导智能
- 云数据库没有公网ip如何访问,navicate ssh隧道 + com.jcraft.jsch