Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle Sequence nextval saute le nombre d'avant en arrière

Je parie que votre base de données exécute RAC (Real Application Clusters). En supposant que ce soit le cas et que vous créez la séquence avec tous les paramètres par défaut, c'est le comportement attendu.

Le paramètre par défaut est de mettre en cache 20 valeurs. Chaque nœud du cluster RAC, par défaut, aura un cache distinct. En supposant que vous avez un cluster avec deux nœuds A et B, la première fois un nextval est demandé sur A, A mettra en cache les valeurs 1-20 et renverra une valeur de 1. Si la prochaine demande d'un nextval est faite sur B, B mettra en cache les valeurs 21-40 et renverra une valeur de 21. À partir de là, la valeur que vous obtiendrez dépendra du nœud sur lequel votre connexion s'exécute.

Généralement, cela ne devrait pas poser de problème. Les séquences génèrent des numéros uniques. Les nombres n'ont généralement pas besoin d'être consécutifs. Si vous avez vraiment besoin que les valeurs soient renvoyées séquentiellement parce que vous faites quelque chose comme trier par la valeur générée par la séquence pour déterminer la "première" ou la "dernière" ligne, vous pouvez utiliser le ORDER lorsque vous créez la séquence pour forcer les valeurs à être renvoyées dans l'ordre. Cela a cependant une implication négative sur les performances dans une base de données RAC, car cela augmente la quantité de communication nécessaire entre les nœuds pour synchroniser les valeurs renvoyées. Si vous devez déterminer la "première" ou la "dernière" ligne, il est généralement préférable d'ajouter une date ou un timestamp colonne à la table et trier par celle-ci plutôt que de supposer que la clé primaire est générée de manière séquentielle.