从AWR报告里发现一个SQL存在大量的version_count.
SYS@xezf(qs-xezf-db1)> select sql_id,version_count from v$sqlarea where version_count> 500 order by 2 desc ;
SQL_ID VERSION_COUNT
------------- -------------
9rwd4wkwm4bsy 3046
cpqsn8zak6sw4 2985
66x4djqka2ppy 976
0z7n7sst85222 617
在v$sqlarea 中保存了SQL的cursor,当有大量的version_count,说明虽然SQL 语句相同,但是Oracle 发现因为某些原因不可重用这些SQL。当这类SQL执行次数很多,就会占用大量的shared pool,引起library cache pin和library cache 的等待事件。
可以使用如下SQL 查看占用内存大小:
/* Formatted on 2011/6/24 21:54:00 (QP5 v5.163.1008.3004) */
SELECT SUM (sharable_mem) / 1024 / 1024 || 'M'
FROM v$sqlarea
WHERE sql_id = 'cpqsn8zak6sw4';
可以通过如下SQL 查看是什么原因导致的不匹配:
SYS@xezf(qs-xezf-db1)> select sql_id,child_number,BIND_MISMATCH from v$sql_shared_cursor where sql_id='9rwd4wkwm4bsy' and BIND_MISMATCH='Y' and rownum<10;
SQL_ID CHILD_NUMBER B
------------- ------------ -
9rwd4wkwm4bsy 3 Y
9rwd4wkwm4bsy 24 Y
9rwd4wkwm4bsy 29 Y
9rwd4wkwm4bsy 33 Y
9rwd4wkwm4bsy 35 Y
9rwd4wkwm4bsy 38 Y
9rwd4wkwm4bsy 51 Y
9rwd4wkwm4bsy 55 Y
9rwd4wkwm4bsy 81 Y
我这是过滤之后的信息,当这些信息有Y时,就是表示cursor 不能重用的原因。
SYS@xezf(qs-xezf-db1)> select count(*) from v$sql_shared_cursor where sql_id='9rwd4wkwm4bsy' and BIND_MISMATCH='Y' ;
COUNT(*)
----------
120
bind_mismatch一般是由于bind value的长度不同导致bind buffer无法重用,最终导致cursor无法重用。
例如: 对于字符类型的字段,进行绑定变量的时候,第一次会使用32字节的BUFFER,如果该值小于32字节的话,第二次执行这个SQL的时候,如果小于32字节,那么可以共享这个CURSOR,如果大于,就无法共享,原因就是BIND_MISMATCH,此时会产生一个子CURSOR,同时分配128字节的BIND BUFFER,以此类推。
正常情况不会产生这么大量的子CURSOR。但是由于一些BUG,会导致问题。
如果没有补丁,一个临时性的解决方案,设置一个较大的BUFFER:
SQL>ALTER SESSION SET EVENTS '10503 trace name context level <buffer length>, forever';
通过v$sql_bind_capture 视图查看一下每次绑定变量的值:
SYS@xezf(qs-xezf-db1)> select position,LAST_CAPTURED,datatype_string,value_string from v$sql_bind_capture where sql_id='9rwd4wkwm4bsy' and rownum<50;
POSITION LAST_CAPTURED DATATYPE_STRING VALUE_STRING
---------- ------------------- -------------------- --------------------
1 2011-06-24 15:54:22 VARCHAR2(32) cp102328
2 2011-06-24 15:54:22 NUMBER 103
3 2011-06-24 15:54:22 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 15:54:22 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:02:54 VARCHAR2(32) s13791223344
2 2011-06-24 16:02:54 NUMBER 103
3 2011-06-24 16:02:54 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:02:54 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:10:41 VARCHAR2(32) 7027976
2 2011-06-24 16:10:41 NUMBER 103
3 2011-06-24 16:10:41 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:10:41 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 17:09:28 VARCHAR2(32) BILLQQ
2 2011-06-24 17:09:28 NUMBER 103
3 2011-06-24 17:09:28 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 17:09:28 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:59:16 VARCHAR2(32) wantai1472888
2 2011-06-24 16:59:16 NUMBER 103
3 2011-06-24 16:59:16 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:59:16 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:59:10 varchar2(32) gy928888@vip.qq.com
2 2011-06-24 16:59:10 NUMBER 103
3 2011-06-24 16:59:10 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:59:10 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:59:09 VARCHAR2(32) 22501165422
2 2011-06-24 16:59:09 NUMBER 103
3 2011-06-24 16:59:09 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:59:09 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:59:07 VARCHAR2(32) 12801165830
2 2011-06-24 16:59:07 NUMBER 103
3 2011-06-24 16:59:07 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:59:07 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:59:00 VARCHAR2(32) 235896734
2 2011-06-24 16:59:00 NUMBER 103
3 2011-06-24 16:59:00 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:59:00 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:58:56 varchar2(32) 978a62e0bbb767d99bda
2 2011-06-24 16:58:56 NUMBER 103
3 2011-06-24 16:58:56 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:58:56 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:58:34 VARCHAR2(32) 708888718@qq.com
2 2011-06-24 16:58:34 NUMBER 209
3 2011-06-24 16:58:34 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:58:34 VARCHAR2(32) yyyy-mm-dd
1 2011-06-24 16:57:51 varchar2(32) syyxQS20110624000364
2 2011-06-24 16:57:51 NUMBER 103
3 2011-06-24 16:57:51 VARCHAR2(32) yyyy-mm-dd
4 2011-06-24 16:57:51 VARCHAR2(32) yyyy-mm-dd
通过以上的查询结果,我们可以肯定是sql_id='9rwd4wkwm4bsy' SQL的第一绑定变量值的长度不同造成bind_mismatch, 从而产生大量的version_counts.
相关的bug信息如下:
Bug:9689310:
- Non sharability of cursors due to BIND_MISMATCH.
Bug:6981690:
- Non sharability of cursors due to PQ_SLAVE_MISMATCH
Bug:8981059:
- Non sharability of cursors due to USER_BIND_PEEK_MISMATCH.
对于Bug 9689310,在MOS上搜了一下,该bug存在的版本如下:
Affects:
Product (Component)
|
Oracle Server (Rdbms)
|
Range of versions believed to be affected
|
Versions BELOW 12.1
|
Versions confirmed as being affected
|
|
Platforms affected
|
Generic (all / most platforms affected)
|
Fixed:
MOS 上给了一个变通的解决方法:Workaround
Alter the client application code so that it uses constant sizes for the MAX bind lengths.
我的库是10.2.0.5的,这个没说修复,也没说存在bug,还真不好确定,看来还是需要测试一下。
不过我这个库上的cursor_sharing 参数是设置为similar的,这样会将SQL 中的谓词值自动用变量来代替。 这样会增加cursor的数量。 为了减少cursor对library cache的占用,还是先将cursor_shring 参数改成了默认的exact模式。 这样version_count 会减少很多,但是硬解析的次数也会增加,可能会增加Library Cache Latch等待。 现在只能这样修改一下,在找个环境测试一下。
Oracle cursor_sharing 参数 详解
http://blog.csdn.net/tianlesoftware/archive/2011/06/17/6551723.aspx
-------------------------------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)
DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823
DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请
分享到:
相关推荐
./bind_exporter [flags] 在Docker容器中运行 使用特定版本提取Docker容器: docker pull prometheuscommunity/bind-exporter:v0.3.0 在Docker容器中运行(作为守护程序),通过localhost与named通信时,请使用--...
利用Bind_DLZ_MySQL_构建智能DNS.pdf
主要给大家介绍了关于MongoDB 3.6版本中bind_ip设置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
bind_polyfill.js
javascirpt this_scope_call_apply_bind_柯里化 详细分析
前端大厂最新面试题-bind_call_apply.docx
javax.xml.bind.helpers 仅由 JAXB 提供者用于: 提供某些 javax.xml.bind 接口的部分默认实现。 javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom ...
javax.xml.bind_2.1.9.v201005080401.jar
sqlite3_bind_parameter_count sqlite3_bind_parameter_index sqlite3_bind_parameter_name sqlite3_bind_text sqlite3_bind_text16 sqlite3_busy_handler sqlite3_busy_timeout sqlite3_changes sqlite3_close ...
bind_param(sss, firstname,lastname, $email); 1. 该函数绑定了 SQL 的参数,且告诉数据库参数的值。 “sss” 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。 参数有以下四种类型: i – integer...
BIND DNS配置详解,包括相信配置信息截图。
浅谈javascript中的call、apply、bind_.docx
被广泛使用的域名服务(DNS)软件
一个超轻量级的数据库sqlite (SQLite源代码),学习数据库的基础源代码。 struct sqlite3_api_routines { void * (*aggregate_context)(sqlite3_... int (*bind_parameter_count)(sqlite3_stmt*); int (*bind_par
golang websocket源码解读,含有 ListenAndService 主要源码 和 默认路由的源码实现
dig命令是一个用于询问 DNS 域名服务器的灵活的工具,此软件适用于Windows平台
Once installed the server will bind to port 15670 and serve few static HTML files on port 15670 (e.g. [http://127.0.0.1:15670](http://127.0.0.1:15670/)). ## Installation This plugin ships with ...
js 方法原理解析 apply、bind