sql >> Base de Datos >  >> RDS >> Oracle

Oracle Sequence nextval está saltando el número de un lado a otro

Apuesto a que su base de datos está ejecutando RAC (Real Application Clusters). Suponiendo que ese sea el caso y que cree la secuencia con todas las configuraciones predeterminadas, ese es el comportamiento esperado.

La configuración predeterminada es almacenar en caché 20 valores. Cada nodo en el clúster de RAC, de forma predeterminada, tendrá una memoria caché independiente. Suponiendo que tiene un clúster con dos nodos A y B, la primera vez que un nextval se solicita en A, A almacenará en caché los valores 1-20 y devolverá un valor de 1. Si la próxima solicitud de un nextval se realiza en B, B almacenará en caché los valores 21-40 y devolverá un valor de 21. A partir de ahí, el valor que obtenga dependerá del nodo en el que se esté ejecutando su conexión.

En general, esto no debería ser un problema. Las secuencias generan números únicos. Los números generalmente no necesitan ser consecutivos. Si realmente necesita que los valores se devuelvan secuencialmente porque está haciendo algo como ordenar por el valor generado por la secuencia para determinar la fila "primera" o "última", puede usar el ORDER cláusula cuando crea la secuencia para forzar que los valores se devuelvan en orden. Sin embargo, eso tiene una implicación negativa en el rendimiento de una base de datos RAC, ya que aumenta la cantidad de comunicación que debe realizarse entre los nodos para sincronizar los valores que se devuelven. Si necesita determinar la "primera" o la "última" fila, generalmente es mejor agregar una date o una timestamp columna a la tabla y ordenar por eso en lugar de asumir que la clave principal se genera secuencialmente.