关于oracle序列的LAST_NUMBER

前端之家收集整理的这篇文章主要介绍了关于oracle序列的LAST_NUMBER前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个序列SEQ_PAGE_ID
SEQUENCE_NAME   INCREMENT_BY  CACHE_SIZE   LAST_NUMBER            
-------------------------------------------------------
SEQ_PAGE_ID      1              20          2222292456

要更改CACHE_SIZE,我使用下面的脚本,

改变序列SEQ_PAGE_ID CACHE 5000;

当我检查查询时,

select ... from user_sequences where sequence_name  = 'SEQ_PAGE_ID';


SEQUENCE_NAME   INCREMENT_BY  CACHE_SIZE    LAST_NUMBER            
-------------------------------------------------------
SEQ_PAGE_ID      1              5000          2222292447

LAST_NUMBER从2222292456更改为2222292447.
这是因为改变脚本而发生的吗?

这是正常的,是的.从 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,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,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,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个值,或者其他地方发生了影响它的事情 – 数据库被弹跳,序列被再次改变,等等

猜你在找的Oracle相关文章