Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g 在序列生成过程中最小化间隙的出现_Oracle11g - Fatal编程技术网

Oracle11g 在序列生成过程中最小化间隙的出现

Oracle11g 在序列生成过程中最小化间隙的出现,oracle11g,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? creat

我知道顺序不能保证不存在间隙,但我希望尽量减少间隙的发生,这样它们只会在异常情况下发生(最好只有在事务回滚时)

我在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?
那么哪一个更好呢

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


谢谢。

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

ASKTOM Quote:“如果你有CACHE=NOCACHE,你当然不会“丢失”任何缓存,你不会丢失任何缓存。如果你锁定缓存序列,你会在关机时丢失一些,但在其他情况下不会。序列在任何情况下都不会没有间隙——永远不会。它们100%保证在任何时候都有间隙 某一点,100%。”

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

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

如果你想按自己的方式管理,那就选择NOCYLCE

同时使用CACHE和NOORDER选项可以获得序列的最佳性能。 如果使用“缓存”选项而不使用“顺序”选项,则每个实例缓存一个单独的数字范围,不同实例可能会无序地分配序号

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

阅读

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


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

这与我想要实现的相反。RAC中的每个节点都将缓存20个元素,所以当从不同节点访问序列时,会出现类似于1、20、2、21的情况。我将重新发布。使用带有NOCACHE、ORDER、NOCYCLE的序列对象构建您自己的vs有什么好处?对于RAC来说,顺序不是必须的,只有在您希望序列以特定顺序给出的情况下。即使如此,如果您的复杂代码首先检索
sequence.NEXTVAL
,然后在插入记录之前执行一长串处理,那么很可能会有另一个事务更早地插入。对于记录的正确排序,我始终建议在使用顺序之前使用
systimestamp
。我同意顺序。我会改正的。关于优势,正如我所说,选项1的控制更好,不会丢失数字。选项2,使用内置序列,其余的留给Oracle。