0

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

我在 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?

那么哪个更好呢?

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

谢谢。

4

1 回答 1

1

对于您的第一条语句,如果数据库重新启动,则 NOCACHE 未指定,因此默认为 20,因此您肯定会丢失数字。但是担心丢失数字是没有意义的,因为回滚,关机肯定会“丢失”一个数字(正如你所说的)。

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

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

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

如果您想以自己的方式管理它,请选择 NOCYLCE。

将 CACHE 和 NOORDER 选项一起使用会导致序列的最佳性能。CACHE 选项在没有 ORDER 选项的情况下使用,每个实例缓存一个单独的数字范围,并且序列号可能被不同的实例乱序分配。

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

这个

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

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

于 2013-10-21T13:37:53.000 回答