oracle sequence last_number,关于oracle序列的LAST_NUMBER

这是正常的,是的.从

documentation for the all_sequences data dictionary view开始,last_number是:

Last sequence number written to disk. If a sequence uses caching, the number written to disk is the last number placed in the sequence cache. This number is likely to be greater than the last sequence number that was used.

这可以使用新的序列重新创建:

SQL> create sequence SEQ_PAGE_ID start with 2222292436 increment by 1 cache 20;

sequence SEQ_PAGE_ID created.

SQL> select sequence_name, increment_by, cache_size, last_number

2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER

------------------------------ ------------ ---------- -----------

SEQ_PAGE_ID 1 20 2222292436

SQL> select SEQ_PAGE_ID.nextval from dual;

NEXTVAL

----------

2222292436

SQL> select sequence_name, increment_by, cache_size, last_number

2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER

------------------------------ ------------ ---------- -----------

SEQ_PAGE_ID 1 20 2222292456

last_number跳过缓存大小,这是正常的.

SQL> alter sequence SEQ_PAGE_ID CACHE 5000;

sequence SEQ_PAGE_ID altered.

SQL> select sequence_name, increment_by, cache_size, last_number

2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER

------------------------------ ------------ ---------- -----------

SEQ_PAGE_ID 1 5000 2222292437

last_number下降,但现在反映了生成的实际最后序列号. DDL(显然)导致写入磁盘的数据被更新以反映当前值,而不是缓存的顶部 – 旧的20值缓存或新的5000值缓存.在你的情况下,你得到了2222292447,这意味着你通过缓存进一步的值比我运行alter时的十个值.

保存到磁盘的值大部分存在,因此如果数据库崩溃,它知道从哪里拿起.重新启动时,序列将开始从记录的last_number生成数字.在正常运行期间,它不需要再引用它,它只是在缓存新值时更新磁盘上的值.这可以防止序列号在崩溃后重新发布,而不需要进行昂贵的(慢速)锁定来实时维护该值 – 毕竟这是缓存所要避免的.

如果last_value低于实际生成的序列,则只会出现问题,但这不会发生. (好吧,除非序列设置为循环).

SQL> select SEQ_PAGE_ID.nextval from dual;

NEXTVAL

----------

2222292437

生成的下一个序列号从高速缓存大小改变之前的最后一个序列号开始;它没有重用旧值,因为你可能一直担心字典值.

SQL> select sequence_name, increment_by, cache_size, last_number

2 from user_sequences where sequence_name = 'SEQ_PAGE_ID';

SEQUENCE_NAME INCREMENT_BY CACHE_SIZE LAST_NUMBER

------------------------------ ------------ ---------- -----------

SEQ_PAGE_ID 1 5000 2222297437

last_number现在显示先前存储的值增加了5000的缓存大小.数据字典中的内容现在不会再次更改,直到我们从缓存中消耗了所有5000个值,或者其他地方发生了影响它的事情 – 数据库被弹跳,序列被再次改变,等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值