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