oracle 11.2.0.1.0 和 oracle 11.2.0.2.0 在使用序列向表中插入值时的差异
Posted
技术标签:
【中文标题】oracle 11.2.0.1.0 和 oracle 11.2.0.2.0 在使用序列向表中插入值时的差异【英文标题】:Difference in oracle 11.2.0.1.0 and oracle 11.2.0.2.0 while inserting a value into the table using sequence 【发布时间】:2013-09-05 14:13:20 【问题描述】:在 Oracle 11.2.0.1.0 中:
1) 我创建了一个表。
create table m1(id number(5,2), version number(5,2), primary key (id));
2) 我创建了一个序列。
CREATE SEQUENCE m1_id_sq;
3) 我在表格中插入了值。
insert into m1(id, version) values (m1_id_sq.nextval, 1);
4) 输出。
id
version
-------------
2
1
*我知道 id=2 的原因是由于从 11.2.0.1.0 开始引入的 deferred_segment_creation 功能。
*我在 oracle 中创建了一个用户实例,并运行了上述三个命令。不像大师。
现在我按照相同的步骤进行操作
在 Oracle 11.2.0.2.0 中,
但我得到的输出是,
id
version
-------------
1
1
请解释为什么在 oracle 11.2.0.2.0 中 id=1 而在 oracle 11.2.0.1.0 中 id=2。万分感谢!
【问题讨论】:
I understand the reason for id=2 is due to deferred_segment_creation
你为什么这么认为?
表和序列不相关 - 没有依赖关系,除非间接通过触发器,您在此处没有。 Ansd 序列没有段。如图所示,您背靠背运行了三个语句,中间没有任何内容 - 例如,在 11.2.0.1 的情况下,您没有执行 insert
、rollback
、insert
?
Note 1050193.1 确实说这是预期的延迟段创建。这并不表明行为在以后的版本中发生了变化,但我没有看到它在 11.2.0.3 中以 2 开头,deferred_segment_creation=TRUE
所以它似乎已被“修复”。无论如何,这并不重要 - 由于其他原因,您会在序列中出现间隙,因此您不应该从 1 开始依赖它。
@Murali - 您需要一个 Oracle 支持帐户才能看到它;如果您有,请登录 support.oracle.com,然后搜索该号码。我认为大卫是对的。这似乎表明这是预期的行为,但它显然已更改,并且注释指的是未发布的错误 - 如果他们已修复该错误,那么它似乎不会在任何地方得到承认,所以我认为您不会得到明确的答案。
orawin.info 网站上有 2 篇关于这种情况的好博文:Post1,Post2。
【参考方案1】:
问题可能是由于 NOORDER 是 Oracle 序列的默认设置,尤其是在您运行 RAC 环境时。
http://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6014.htm
我了解到使用序列,如果我想保证它们是连续的,我通常必须在创建序列时添加以下关键字:
CREATE SEQUENCE m1_id_sq ORDER NOCACHE;
编辑参考上面的cmets:
正如 Alex Poole 在上述 cmets 中所指出的:
“无论如何这都不重要 - 你会在序列中得到间隙 出于其他原因,因此您不应依赖从 1" 开始的它
作为序列默认值的 NOORDER 解释了这个问题。
Alex Poole 还指出了一个已知问题:Oracle Note 1050193.1(需要 Oracle 支持帐户)与 deferred_segment_creation=TRUE
的问题相关
ThinkJet 还参考以下文章:
http://orawin.info/blog/2010/04/25/new-features-new-defaults-new-side-effects/ http://orawin.info/blog/2011/11/17/new-defaults-old-side-effects/【讨论】:
所有带有答案的原因都已在 cmets 中发布。见亚历克斯普尔评论 我确实看到了 cmets,但值得注意的是 RAC 环境的问题,并且 NOORDER 参数是序列的默认值。我还不能将 cmets 添加到默认帖子,否则我会在那里这样做。以上是关于oracle 11.2.0.1.0 和 oracle 11.2.0.2.0 在使用序列向表中插入值时的差异的主要内容,如果未能解决你的问题,请参考以下文章
oracle拨云见日第9篇之Oracle10.2.0.1升级11.2.0.4.3
oracle11g数据库的安装和 使用Navicat Premium 实现Oracle数据库连接