查看: 4824|回复: 9

version_count到底是怎么算的???(玉面飞龙请进)

[复制链接]
论坛徽章:
3
生肖徽章:虎
日期:2007-09-18 15:23:56会员2007贡献徽章
日期:2007-09-26 18:42:10奥运会纪念徽章:皮划艇激流回旋
日期:2008-06-12 17:50:19
发表于 2007-4-27 17:24 | 显示全部楼层 |阅读模式
http://yumianfeilong.com/2007/04 ... %e5%a4%aa%e5%a4%9a/
这是你的blog上的文章
里面提到

Oracle Bind Variable在Varchar2字段上存在一些坎儿,32,128,2000。意味着在应用中(N>2000),一个Varchar2(N),可以贡献4个不同的子游标。2个Varchar2(N)可以贡献7个子游标。如果一个表上有10个Varchar2(N)的子段,则可以贡献31个游标。就是SQL Version Count = 3*N + 1 如果表很多,有M个,就是SQL Version Count = 3*N*M + M


你后面给的tomkyte的文章也是这样的意思

可是在我这里却不是这样的

table  T_ETYLOGFIELD
(
  LOGID           VARCHAR2(50 BYTE),
  NAME            VARCHAR2(500 BYTE),
  LOGVALUE    VARCHAR2(4000 BYTE),
  SID                 NUMBER(14)  NOT NULL,
  PREVALUE    VARCHAR2(4000 BYTE),
  CHANGETIME  DATE
)

INSERT INTO T_ETYLOGFIELD (LOGID, NAME, LOGVALUE, PREVALUE, CHANGETIME) VALUES (:B5 , :B4 , :B3 , :B2 , :B1 )

这样一个sql居然可以有超过32768个version_count,然后引发ora-600

trace file:
LIBRARY OBJECT HANDLE: handle=2ecfcca8
name=INSERT INTO T_ETYLOGFIELD (LOGID, NAME, LOGVALUE, PREVALUE, CHANGETIME) VALUES (:B5, :B4, :B3, :B2, :B1)
.........
LIBRARY OBJECT: object=2ec6f18c
  type=CRSR flags=EXS[0001] pflags= [00] status=VALD load=0
  CHILDREN: size=32768
............
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [17059], [0x2EC6F18C], [], [], [], [], [], []

在metalink上找了好久,发现几个关于version_count 的bug,其中一个证实在9i中还未解决:
Bug 4297280  OERI[17059] can occur if over 32767 schemas reference an object
Workaround:
  Flush the shared pool
这个bug里的reference就是上面trace file里那个sql出现了多过32768个child
这里的child就是指因为bind mismatch而造成了oracle寻找相同sql重用执行计划时找到的许多相同的sql却不能重用,

而且我一直以为一个varchar2(4000)变量的坎不止你说的那4个 1 , 32,128,2000
但是看了你给TOMKYTE的文章
却有迷惑了
如果真是你们说的那样
那我给的这个sql是如何能突破32768个version_cout呢?
那个sql里的5个变量 2个是varchar2(4000)
一个是varchar2(500) 一个是varchar2(50)
就算是4*4*3*2也是96个啊

请高人解答我的疑惑!
论坛徽章:
3
生肖徽章:虎
日期:2007-09-18 15:23:56会员2007贡献徽章
日期:2007-09-26 18:42:10奥运会纪念徽章:皮划艇激流回旋
日期:2008-06-12 17:50:19
 楼主| 发表于 2007-4-27 17:39 | 显示全部楼层
这个疑惑困惑我很久了
而且到现在这个问题还没有个更好的解决方案
只能是监控这个sql的version_count超过3000就flush shared pool
但这应该不是解决问题的根本

使用道具 举报

回复
论坛徽章:
3
生肖徽章:虎
日期:2007-09-18 15:23:56会员2007贡献徽章
日期:2007-09-26 18:42:10奥运会纪念徽章:皮划艇激流回旋
日期:2008-06-12 17:50:19
 楼主| 发表于 2007-4-27 17:39 | 显示全部楼层
顶下

使用道具 举报

回复
论坛徽章:
3
生肖徽章:虎
日期:2007-09-18 15:23:56会员2007贡献徽章
日期:2007-09-26 18:42:10奥运会纪念徽章:皮划艇激流回旋
日期:2008-06-12 17:50:19
 楼主| 发表于 2007-4-27 17:42 | 显示全部楼层
再顶下

使用道具 举报

回复
论坛徽章:
27
授权会员
日期:2005-10-30 17:05:33管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36优秀写手
日期:2013-12-18 09:29:13马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
发表于 2007-4-28 16:28 | 显示全部楼层
有可能是JDBC的bug

使用道具 举报

回复
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
发表于 2007-4-28 16:32 | 显示全部楼层
最初由 eagle_fan 发布
[B]有可能是JDBC的bug [/B]



  eagle_fan说以前我们碰见过,是jdbc的bug。

不知道你用的是什么?

使用道具 举报

回复
论坛徽章:
3
生肖徽章:虎
日期:2007-09-18 15:23:56会员2007贡献徽章
日期:2007-09-26 18:42:10奥运会纪念徽章:皮划艇激流回旋
日期:2008-06-12 17:50:19
 楼主| 发表于 2007-5-7 09:29 | 显示全部楼层
JDBC的BUG
能说的详细点吗?

使用道具 举报

回复
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
发表于 2007-5-11 20:30 | 显示全部楼层
最初由 ihekoko 发布
[B]JDBC的BUG
能说的详细点吗? [/B]


比方说jdbc的Version.....

使用道具 举报

回复
认证徽章
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
发表于 2011-7-8 18:30 | 显示全部楼层
up

使用道具 举报

回复
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
发表于 2012-6-20 10:16 | 显示全部楼层
for jdbc:


4. Last thing to note. I have strong feeling that your problematic INSERT ... is executed in programming language like Java through JDBC (or php?). In this case, you can't depend on the above workarounds. In this case, try following:

String v20 = "test";
// Append lengty blank till the length is 4000;
v20 += "test" + " ";
...
PreparedStatement stmt = con.prepareStatement("INSERT ... INTO ...
VALUES(..., RTRIM(?), ...";
stmt.setString(20, v20);

By transferring lengthy string to Oracle, you have just "one" sharable SQL statements whose bind variable length is 4000. And by applying RTRIM function, you're dummy blank is not stored in table.
But this method can incur increased network overhead.

You need to test as many workarounds as possible.

Good luck

https://forums.oracle.com/forums/thread.jspa?threadID=573360

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表