Oracle
 sql >> Database >  >> RDS >> Oracle

LAST_NUMBER sulla sequenza di Oracle

Questo è normale, sì. Dalla documentazione per all_sequences vista dizionario dati , last_number è:

Questo può essere ricreato con una nuova sequenza:

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 

Il last_number aumentato della dimensione della cache, che è normale.

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 

Il last_number scende, ma ora riflette l'ultimo numero di sequenza generato. Il DDL (apparentemente) ha causato l'aggiornamento dei dati scritti sul disco per riflettere quello che sembra essere il valore corrente, piuttosto che la parte superiore della cache:la vecchia cache da 20 valori o la nuova cache da 5000 valori. Nel tuo caso hai 2222292447 , il che significa solo che eri dieci valori più avanti nella cache rispetto a quando ho eseguito alter .

Il valore salvato su disco è in gran parte lì in modo che se il database si arresta in modo anomalo sa da dove prelevare. Al riavvio, la sequenza inizierà a generare numeri dal last_number registrato . Durante il normale funzionamento non è necessario fare riferimento a quello, aggiorna semplicemente il valore sul disco quando vengono memorizzati nella cache nuovi valori. Ciò impedisce che i numeri di sequenza vengano riemessi dopo un arresto anomalo, senza la necessità di eseguire un blocco costoso (lento) per mantenere il valore in tempo reale, che è ciò che la cache è lì per evitare, dopotutto.

Ci sarebbe un problema solo se il last_value era inferiore a una sequenza generata effettiva, ma ciò non può accadere. (Beh, a meno che la sequenza non sia impostata su ciclo).

SQL> select SEQ_PAGE_ID.nextval from dual;

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

Il successivo numero di sequenza generato segue l'ultimo prima della modifica della dimensione della cache; non ha riutilizzato un vecchio valore poiché potresti essere preoccupato dal valore del dizionario.

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 

Il last_number ora mostra il valore memorizzato precedente incrementato della dimensione della cache di 5000. Ciò che è nel dizionario dei dati ora non cambierà di nuovo fino a quando non avremo consumato tutti i 5000 valori dalla cache, o succede qualcosa altrove che lo influenza - il database viene rimbalzato , la sequenza viene nuovamente modificata, ecc.