Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Database oracle中序列的缓存值_Database_Oracle Sqldeveloper_Oracle Apex_Rdbms_Oracle Sql Data Modeler - Fatal编程技术网

Database oracle中序列的缓存值

Database oracle中序列的缓存值,database,oracle-sqldeveloper,oracle-apex,rdbms,oracle-sql-data-modeler,Database,Oracle Sqldeveloper,Oracle Apex,Rdbms,Oracle Sql Data Modeler,当我从下面创建的序列试验生成序列值时,它给出了1,2,21,41,4 我对缓存的工作感到困惑。第一次调用NEXTVAL时(在创建序列之后),序列中的哪些值存储在缓存中?它们是从1到20(包括1到20),还是仅仅是介于MINVALUE和MAXVALUE之间的随机20个数字? 现在,如果缓存在序列范围内存储随机的20个数字,那么这没关系,但是如果缓存在1到20之间存储,那么为什么它会给出21,然后是41,它应该给出1到20范围内的值,直到这个范围内的所有值都用完为止?我特别想通过不使用NOCACHE

当我从下面创建的序列试验生成序列值时,它给出了1,2,21,41,4

我对缓存的工作感到困惑。第一次调用NEXTVAL时(在创建序列之后),序列中的哪些值存储在缓存中?它们是从1到20(包括1到20),还是仅仅是介于MINVALUE和MAXVALUE之间的随机20个数字? 现在,如果缓存在序列范围内存储随机的20个数字,那么这没关系,但是如果缓存在1到20之间存储,那么为什么它会给出21,然后是41,它应该给出1到20范围内的值,直到这个范围内的所有值都用完为止?我特别想通过不使用NOCACHE和/或ORDER来理解这一点。
另外,我只是在学习,而不是用于RAC。

您描述过,您得到的序列值的顺序是1、2、21、41、4。您是否从APEX内部执行nextval查询?这可能确实是正确的

APEX使用连接池,不能通过连接共享序列缓存,因此每个连接都有自己的序列缓存

假设您有一个包含5个连接的连接池。在该连接中执行sequence.nextval时,每个连接将创建自己的序列缓存值

连接1-序列缓存1-20

连接2-序列缓存21-40

连接3-序列缓存41-60

连接4-序列缓存61-80

连接5-序列缓存81-100

您可以想象,当APEX控制它将在连接池中使用的连接时,不可能事先确定顺序

简言之:

  • 序列将按升序生成一个数字,如1、2、3、4、5等。。不是随机的
  • 该序列中可能存在间隙,如1,2,4,5,8,9,10。此处跳过3、6、7,以后将不再使用
  • 如果通过APEX运行,则可以/将使用多个连接,因此将使用多个缓存序列范围。您将看到的顺序可能类似于1,21,41,22,42,2,3,43。从1跳到21到41,再跳回到22不是间隙,而是因为它使用的是不同的连接,因此是不同的缓存序列范围。我使用了1、21、41,因此您可以在示例中看到缓存20的行为
您可以尝试将其作为脚本执行,以查看正确的行为:

DROP SEQUENCE trial_seq
/

CREATE SEQUENCE trial_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20
/

create table trial_test( id number)
/

insert into trial_test
select trial_seq.nextval
from   dual
connect by rownum <= 10
/

select *
from   trial_test
/
DROP-SEQUENCE试验
/
创建序列试验
最小值1
最大值999999999999999999999999999
从1开始
增加1
缓存20
/
创建表试用测试(id号)
/
插入试用测试
选择试用期_seq.nextval
来自双重

按rownum连接您确定没有使用RAC吗?这看起来就像您在2节点集群的每个实例中看到的20个值的单独缓存。如果没有,你如何打电话给nextval并查看按顺序排列的号码;也许这是insert的一部分,当你查询表时,你看到它们的顺序与序列不匹配?@AlexPoole实际上我在Oracle Apex上练习。当我开始通过反复执行“SELECT trail_seq.NEXTVAL FROM DUAL”来查看值时,我突然想到了这个问题。这是一个信息丰富的注释。但我的要求不同。当我们使用缓存20时,apex是否应该在给出大于20的数字之前从1-20输出20个数字(不需要排序)?或者就像缓存存储了一些随机的20个数字(包括1,2,21,41,4,…)的值,从这个缓存的随机数字中,它给出了值?或者,缓存是否有其他生成数字的方式?(注意:-我假设我在序列生成刚刚创建之后使用它)更新了我的答案。如果APEX使用一个连接,序列的输出将按升序从1到20。然而,差距可以存在,但不能倒退。。跳转的发生是因为APEX使用了连接池。这对你有意义吗?
DROP SEQUENCE trial_seq
/

CREATE SEQUENCE trial_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20
/

create table trial_test( id number)
/

insert into trial_test
select trial_seq.nextval
from   dual
connect by rownum <= 10
/

select *
from   trial_test
/