Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

LAST_NUMBER na sequência do oráculo


Isso é normal sim. Da documentação para all_sequences visualização do dicionário de dados , last_number é:

Isso pode ser recriado com uma nova sequência:
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 

O last_number saltou pelo tamanho do cache, o que é normal.
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 

O last_number diminui, mas agora reflete o último número de sequência real gerado. O DDL (aparentemente) fez com que os dados gravados no disco fossem atualizados para refletir o que é o valor atual, em vez do topo do cache - o cache antigo de 20 valores ou o novo cache de 5.000 valores. No seu caso, você tem 2222292447 , o que significa apenas que você estava dez valores mais longe no cache do que eu quando executei o alter .

O valor salvo no disco está em grande parte lá para que, se o banco de dados travar, ele saiba de onde pegar. Ao reiniciar, a sequência começará a gerar números a partir do last_number gravado . Durante a execução normal, ele não precisa se referir a isso, apenas atualiza o valor no disco quando novos valores são armazenados em cache. Isso evita que os números de sequência sejam reemitidos após uma falha, sem precisar fazer um bloqueio caro (lento) para manter o valor em tempo real - que é o que o cache existe para evitar, afinal.

Só haveria um problema se o last_value foi menor do que uma sequência gerada real, mas isso não pode acontecer. (Bem, a menos que a sequência esteja configurada para ciclo).
SQL> select SEQ_PAGE_ID.nextval from dual;

   NEXTVAL
----------
2222292437 

O próximo número de sequência gerado segue o último antes da alteração do tamanho do cache; ele não reutilizou um valor antigo como você pode estar preocupado com o valor do dicionário.
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 

O last_number agora mostra o valor armazenado anterior incrementado pelo tamanho do cache de 5000. O que está no dicionário de dados agora não mudará novamente até que tenhamos consumido todos os 5000 valores do cache, ou algo aconteça em outro lugar que o afete - o banco de dados sendo devolvido , a sequência sendo alterada novamente, etc.