我有一个用nocycle,noorder,cache 100和increment by 1创建的序列。我使用下面的SQL生成序列:
select myseq.nextVal from dual;有了这个序列,我在一天内得到了206764957和206765478之间的值。几天后,当我再次使用这个过程时,它给了我206765361和206793474之间的值。
因此,在我的第一次运行中,最高的数字是206765478,在第二次运行中,最低的数字是206765361。我原以为第二轮的所有数字都会高于第一次运行时的所有数字,而不是它们的重叠。
你能帮忙找出这个序列的问题吗?
发布于 2016-10-03 14:19:43
从文件中:
阶 指定顺序,以确保按请求顺序生成序列号。如果您使用序列号作为时间戳,则此子句非常有用。对于用于生成主键的序列来说,保证顺序通常并不重要。 如果您正在使用Oracle实时应用程序集群,则订单只需要保证有序生成。如果您使用独占模式,则始终按顺序生成序列号。 NOORDER 如果不希望确保按请求顺序生成序列号,请指定NOORDER。这是默认的。
您已经指定了noorder,因此不能保证按请求的顺序生成序列编号。从您所看到的行为来看,假设您的断言没有修改序列是正确的,那么您似乎在使用RAC,并且看到了在RAC节点间实现缓存的方式的效果。
如果使用序列号,则始终使用带有NOORDER选项的缓存,以实现序列号生成中的最佳性能。但是,使用CACHE选项,您可能会在序列号中出现空白。如果您的环境不能容忍序列号间隙,那么使用NOCACHE选项或考虑预先生成序列号。如果您的应用程序需要序号排序,但可以容忍空白,那么在Oracle RAC中使用CACHE和ORDER来缓存和排序序列号。如果您的应用程序需要没有间隙的有序序列号,那么使用NOCACHE和ORDER。与其他缓存和排序组合相比,NOCACHE和ORDER组合对性能的影响最大。
如果试图使用序列来显示创建行的顺序,则可以使用order,但使用会让事情慢下来。使用时间戳列可能更可靠,尽管它受到操作系统支持的精度的限制,而且可能不是唯一的。
https://stackoverflow.com/questions/39832607
复制相似问题