Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle 使用缓存按顺序生成数字时出现问题_Oracle_Oracle11g - Fatal编程技术网

Oracle 使用缓存按顺序生成数字时出现问题

Oracle 使用缓存按顺序生成数字时出现问题,oracle,oracle11g,Oracle,Oracle11g,我用nocycle、noorder、cache 100和增量1创建了一个序列。我正在使用以下SQL生成序列: select myseq.nextVal from dual; 通过这个序列,我在一天内得到了介于206764957和206765478之间的值。几天后,当我再次使用这个过程时,它给了我介于206765361和206793474之间的值 因此,在我的第一次跑步中,最高的数字是206765478,而在我的第二次跑步中,最低的数字是206765361。我希望第二轮的所有数字都高于第一轮的所

我用
nocycle
noorder
cache 100
增量1创建了一个序列。我正在使用以下SQL生成序列:

select myseq.nextVal from dual;
通过这个序列,我在一天内得到了介于
206764957
206765478
之间的值。几天后,当我再次使用这个过程时,它给了我介于
206765361
206793474
之间的值

因此,在我的第一次跑步中,最高的数字是
206765478
,而在我的第二次跑步中,最低的数字是
206765361
。我希望第二轮的所有数字都高于第一轮的所有数字,而不是重叠


您能否帮助查找此序列的问题?

来自文档:

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

只有在使用Oracle Real Application Clusters时,为了保证有序生成,才需要顺序。如果您使用的是独占模式,则序列号始终按顺序生成

NOORDER
如果不想保证序列号按请求的顺序生成,请指定NOORDER。这是默认设置

您已经指定了
noorder
,因此不能保证按照请求的顺序生成序列号。从您看到的行为来看,假设您断言序列没有被修改是真的,那么您似乎正在使用RAC,并且正在看到跨RAC节点实现缓存的方式的效果

从以下方面:

如果使用序列号,则始终使用带NOORDER选项的缓存,以在序列号生成中获得最佳性能。但是,使用“缓存”选项时,序列号中可能会有间隙。如果环境不能容忍序列号空缺,则使用NoCax选项或考虑预先生成序列号。如果您的应用程序需要序列号排序,但可以容忍间隙,则使用“缓存和顺序”在Oracle RAC中缓存和排序序列号。如果您的应用程序需要无间隙的有序序列号,则使用NOCACHE和ORDER。与其他缓存和排序组合相比,NOCACHE和ORDER组合对性能的负面影响最大


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

来自文档:

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

只有在使用Oracle Real Application Clusters时,为了保证有序生成,才需要顺序。如果您使用的是独占模式,则序列号始终按顺序生成

NOORDER
如果不想保证序列号按请求的顺序生成,请指定NOORDER。这是默认设置

您已经指定了
noorder
,因此不能保证按照请求的顺序生成序列号。从您看到的行为来看,假设您断言序列没有被修改是真的,那么您似乎正在使用RAC,并且正在看到跨RAC节点实现缓存的方式的效果

从以下方面:

如果使用序列号,则始终使用带NOORDER选项的缓存,以在序列号生成中获得最佳性能。但是,使用“缓存”选项时,序列号中可能会有间隙。如果环境不能容忍序列号空缺,则使用NoCax选项或考虑预先生成序列号。如果您的应用程序需要序列号排序,但可以容忍间隙,则使用“缓存和顺序”在Oracle RAC中缓存和排序序列号。如果您的应用程序需要无间隙的有序序列号,则使用NOCACHE和ORDER。与其他缓存和排序组合相比,NOCACHE和ORDER组合对性能的负面影响最大


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

您是否确定每次运行都会产生哪些行?您如何从另一列(例如,时间戳)中分辨出自运行以来无法修改的行?如果您确定,是否有人在这两次运行之间修改了序列?我确定,没有人在这两次运行之间进行了修改,并且还确定了每次运行生成的seq。运行是使用新的数据库连接,还是在两次运行之间都处于活动状态的池连接?是否有任何单独的数字重复,或者您是否只看到100个块被梯段交错?您是否正在使用RAC(每个节点都可以有自己的缓存,但不会重叠)?您是否确定哪些行来自每次运行-如何从另一列(例如,时间戳)中辨别,这些列自运行以来无法修改?如果您确定,是否有人在这两次运行之间修改了序列?我确定,没有人在这两次运行之间进行了修改,并且还确定了每次运行生成的seq。运行是使用新的数据库连接,还是在两次运行之间都处于活动状态的池连接?是否有任何单个数字重复