Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

O Oracle Sequence nextval está pulando o número para frente e para trás


Aposto que seu banco de dados está executando RAC (Real Application Clusters). Supondo que seja esse o caso e que você crie a sequência com todas as configurações padrão, esse é o comportamento esperado.

A configuração padrão é armazenar em cache 20 valores. Cada nó no cluster RAC, por padrão, terá um cache separado. Supondo que você tenha um cluster com dois nós A e B, na primeira vez um nextval for solicitado em A, A armazenará em cache os valores de 1 a 20 e retornará um valor de 1. Se a próxima solicitação de um nextval é feito em B, B armazenará em cache os valores 21-40 e retornará um valor de 21. A partir daí, o valor obtido dependerá do nó em que sua conexão está sendo executada.

Geralmente, isso não deve ser um problema. As sequências geram números únicos. Os números geralmente não precisam ser consecutivos. Se você realmente precisa que os valores sejam retornados sequencialmente porque você está fazendo algo como ordenar pelo valor gerado pela sequência para determinar a "primeira" ou "última" linha, você pode usar o ORDER cláusula quando você cria a sequência para forçar os valores a serem retornados em ordem. Isso tem uma implicação negativa de desempenho em um banco de dados RAC, no entanto, porque aumenta a quantidade de comunicação que precisa continuar entre os nós para sincronizar os valores retornados. Se você precisar determinar a "primeira" ou a "última" linha, geralmente é melhor adicionar uma date ou um timestamp coluna para a tabela e ordene por isso, em vez de assumir que a chave primária é gerada sequencialmente.