使用缓存在序列中生成数字的问题

时间:2016-10-03 13:16:29

标签: oracle oracle11g

我有一个使用nocyclenoordercache 100increment by 1创建的序列。我使用下面的SQL生成序列:

select myseq.nextVal from dual;

通过这个序列,我在一天之间获得了206764957206765478之间的值。几天后,当我再次使用此过程时,它给出了206765361206793474之间的值。

所以在我的第一次运行中,最高的数字是206765478,在我的第二次运行中,最低的数字是206765361。我期待第二次运行中的所有数字都高于第一次运行中的数字ll,而不是让它们重叠。

你能帮忙找到这个序列的问题吗?

1 个答案:

答案 0 :(得分:5)

来自文档:

  

<强> ORDER
  指定ORDER以保证按请求顺序生成序列号。如果使用序列号作为时间戳,则此子句很有用。对于用于生成主键的序列,保证顺序通常并不重要。

     

如果您使用的是Oracle Real Application Clusters,则只需保证ORDER生成。如果使用独占模式,则始终按顺序生成序列号。

     

<强> NOORDER
  如果您不想保证按请求顺序生成序列号,请指定NOORDER。这是默认值。

您已指定noorder,因此无法保证按请求的顺序生成序列号。根据您所看到的行为,并假设断言序列未被修改为真,您似乎正在使用RAC并且正在看到跨RAC节点实现缓存的方式的效果。

来自Real Application Clusters Administration and Deployment Guide

  

如果使用序列号,则始终使用带有NOORDER选项的CACHE,以便在序列号生成中获得最佳性能。但是,使用CACHE选项,序列号中可能存在间隙。如果您的环境无法容忍序列号间隙,请使用NOCACHE选项或考虑预生成序列号。如果您的应用程序需要序列号排序但可以容忍间隙,那么使用CACHE和ORDER在Oracle RAC中缓存和排序序列号。如果您的应用程序需要有序序列号而没有间隙,则使用NOCACHE和ORDER。与其他缓存和排序组合相比,NOCACHE和ORDER组合对性能的负面影响最大。

如果您尝试使用序列来显示创建行的顺序,那么您可以使用orderwill slow things down。使用时间戳列可能更可靠,但这受到操作系统支持的精度的限制,并且可能不是唯一的。