2

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

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

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

4

1 回答 1

2

您描述您按以下顺序获得一个序列值 1、2、21、41、4。您是否从 APEX 中执行 nextval 查询?这可能确实是正确的。

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

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

Connection 1 - Sequence cache 1 - 20
Connection 2 - Sequence cache 21 - 40
Connection 3 - Sequence cache 41 - 60
Connection 4 - Sequence cache 61 - 80
Connection 5 - Sequence cache 81 - 100

可以想象,当 APEX 在连接池中控制要使用哪个连接时,不可能事先确定顺序。

简而言之:

  • 该序列将按升序生成一个数字,fe 1,2,3,4,5 等.. 不是随机的。
  • 该序列中可能存在间隙,fe 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,因此您可以在示例中看到 CACHE 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
/

结果如何?它应该是 1 - 10,或者至少接近该结果。

让我知道这是否回答了您的问题。

于 2020-08-31T07:20:31.703 回答