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

Oracle Sequence nextval springt die Zahl hin und her

Ich wette, dass Ihre Datenbank RAC (Real Application Clusters) ausführt. Unter der Annahme, dass dies der Fall ist und Sie die Sequenz mit allen Standardeinstellungen erstellen, ist dies das erwartete Verhalten.

Die Standardeinstellung ist, 20 Werte zwischenzuspeichern. Jeder Knoten im RAC-Cluster hat standardmäßig einen separaten Cache. Angenommen, Sie haben einen Cluster mit zwei Knoten A und B, das erste Mal ein nextval auf A angefordert wird, speichert A die Werte 1–20 und gibt einen Wert von 1 zurück. Wenn die nächste Anforderung für ein nextval auf B erstellt wird, speichert B die Werte 21-40 und gibt einen Wert von 21 zurück. Von dort hängt der Wert, den Sie erhalten, von dem Knoten ab, auf dem Ihre Verbindung gerade läuft.

Im Allgemeinen sollte dies kein Problem sein. Sequenzen erzeugen eindeutige Nummern. Die Nummern müssen im Allgemeinen nicht fortlaufend sein. Wenn Sie Werte wirklich sequentiell zurückgeben müssen, weil Sie so etwas wie das Sortieren nach dem sequenzgenerierten Wert tun, um die „erste“ oder „letzte“ Zeile zu bestimmen, können Sie den ORDER verwenden -Klausel, wenn Sie die Sequenz erstellen, um zu erzwingen, dass die Werte der Reihe nach zurückgegeben werden. Dies wirkt sich jedoch negativ auf die Leistung einer RAC-Datenbank aus, da es die Kommunikationsmenge erhöht, die zwischen den Knoten stattfinden muss, um die zurückgegebenen Werte zu synchronisieren. Wenn Sie die "erste" oder "letzte" Zeile bestimmen müssen, ist es im Allgemeinen besser, ein date hinzuzufügen oder ein timestamp Spalte zur Tabelle hinzufügen und danach sortieren, anstatt davon auszugehen, dass der Primärschlüssel sequentiell generiert wird.