最小化序列生成期间间隙的发生

时间:2013-10-21 13:31:11

标签: oracle11g

我知道序列并不能保证没有间隙,但我希望尽量减少它们的出现,因此它们只会在特殊情况下发生(最好只在事务回滚时才会发生)。

我在RAC中有几个节点可以同时访问序列。

create sequence seq_1 start with 1 order; # this seems to return numbers without gaps, but what will happen when database is restarted? will cached elements be dropped?
create sequence seq_2 start with 1 nocache; # this one also seems to return numbers in order without gaps, but I heard some objections about using nocache as it hinders performance
create sequence seq_3 start with 1 nocache order; # any improvements over previous two?

哪一个更好?

作为替代方案,我可以使用表来存储序列号,但是目前我想考虑基于序列的解决方案而不是基于表格。

感谢。

1 个答案:

答案 0 :(得分:1)

对于您的第一个语句,如果重新启动数据库,则不指定NOCACHE,因此默认为20,因此您肯定会丢失数字。但是没有必要担心失去这些数字,因为回滚,关闭肯定会“失去”一个数字(正如你正确地说的那样)。

ASKTOM引用:“如果你有CACHE = NOCACHE,你当然不会”丢失“任何一个,你没有任何缓存丢失。如果你固定一个缓存序列,你'在关机时会丢失一些但是没有其他情况。在任何情况下,序列都不会没有间隙 - 永远。他们100%保证有一个缺口 一点。 100%“

使用ORDER只是为了保证RAC的有序生成。如果使用独占模式,则始终按顺序生成序列号。由于NOORDER是默认值,因此请使用ORDER关键字。

如果省略CACHE和NOCACHE,则默认情况下数据库会缓存20个序列号。如果您在Oracle Real Application Clusters环境中使用序列,Oracle建议使用CACHE设置来增强性能。

如果您想以自己的方式管理,请转到NOCYLCE。

同时使用CACHE和NOORDER选项可以获得序列的最佳性能。 在没有ORDER选项的情况下使用CACHE选项,每个实例都缓存一个单独的数字范围,并且可能由不同的实例按顺序分配序列号。

CACHE选项使每个实例缓存其自己的数字范围,从而减少对Oracle数据字典的I / O,并且NOORDER选项消除了互连上的消息流量,以协调跨数据库的所有实例的数字顺序分配。 NOCACHE将会很慢......

阅读this

我的建议是一个临时表,将SEQNAME,STARTVAL,ENDVAL,CURRVAL保存为列,并将它们用作CURRVAL + 1并更新最新版本。 - 对于严格的编号,可以更好地控制,但重新发明轮子。

如果你仍然需要坚持序列,那么我的建议是NOCACHE,ORDER,NOCYCLE。