Oracle
 sql >> Datenbank >  >> RDS >> Oracle

LAST_NUMBER auf Oracle-Sequenz

Das ist normal, ja. Aus der Dokumentation für die all_sequences Datenwörterbuchansicht , last_number ist:

Dies kann mit einer neuen Sequenz neu erstellt werden:

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 

Die last_number um die Cache-Größe nach oben gesprungen, was normal ist.

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 

Die last_number sinkt, spiegelt aber jetzt die tatsächlich zuletzt generierte Sequenznummer wider. Die DDL hat (anscheinend) bewirkt, dass die auf die Festplatte geschriebenen Daten aktualisiert werden, um den aktuellen Wert widerzuspiegeln, und nicht den Anfang des Caches - entweder den alten 20-Werte-Cache oder den neuen 5000-Werte-Cache. In Ihrem Fall haben Sie 2222292447 , was nur bedeutet, dass Sie zehn Werte weiter durch den Cache gegangen sind als ich, als ich alter ausgeführt habe .

Der auf der Festplatte gespeicherte Wert ist größtenteils vorhanden, sodass die Datenbank bei einem Absturz weiß, wo sie abholen muss. Beim Neustart beginnt die Sequenz, Zahlen aus der aufgezeichneten last_number zu generieren . Während des normalen Betriebs muss es nicht darauf zurückgreifen, es aktualisiert nur den Wert auf der Festplatte, wenn neue Werte zwischengespeichert werden. Dadurch wird verhindert, dass Sequenznummern nach einem Absturz neu ausgegeben werden, ohne dass teure (langsame) Sperren erforderlich sind, um den Wert in Echtzeit aufrechtzuerhalten – was der Cache schließlich vermeiden soll.

Es würde nur ein Problem geben, wenn der last_value niedriger war als eine tatsächlich generierte Sequenz, aber das kann nicht passieren. (Nun, es sei denn, die Sequenz ist auf Zyklus eingestellt).

SQL> select SEQ_PAGE_ID.nextval from dual;

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

Die nächste generierte Folgenummer folgt auf die letzte vor der Änderung der Cache-Größe; Es hat keinen alten Wert wiederverwendet, wie Sie vielleicht wegen des Wörterbuchwerts befürchtet haben.

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 

Die last_number zeigt jetzt den vorherigen gespeicherten Wert erhöht um die Cache-Größe von 5000 an. Was sich im Datenwörterbuch befindet, ändert sich jetzt nicht mehr, bis wir alle 5000 Werte aus dem Cache verbraucht haben oder etwas anderswo passiert, das sich darauf auswirkt - die Datenbank wird geprellt , die Reihenfolge wird wieder geändert usw.