Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle Sequence nextval sta saltando il numero avanti e indietro

Scommetto che il tuo database esegue RAC (Cluster di applicazioni reali). Supponendo che sia così e che tu crei la sequenza con tutte le impostazioni predefinite, questo è il comportamento previsto.

L'impostazione predefinita è di memorizzare nella cache 20 valori. Ogni nodo nel cluster RAC, per impostazione predefinita, avrà una cache separata. Supponendo di avere un cluster con due nodi A e B, la prima volta un nextval è richiesto su A, A memorizzerà nella cache i valori 1-20 e restituirà un valore di 1. Se la prossima richiesta per un nextval è impostato su B, B memorizzerà nella cache i valori 21-40 e restituirà un valore di 21. Da lì, il valore che otterrai dipenderà dal nodo su cui è in esecuzione la tua connessione.

In generale, questo non dovrebbe essere un problema. Le sequenze generano numeri univoci. I numeri generalmente non devono essere consecutivi. Se hai davvero bisogno che i valori vengano restituiti in sequenza perché stai facendo qualcosa come ordinare in base al valore generato dalla sequenza per determinare la "prima" o "ultima" riga, puoi usare ORDER quando si crea la sequenza per forzare la restituzione dei valori in ordine. Ciò ha un'implicazione negativa sulle prestazioni in un database RAC, tuttavia, poiché aumenta la quantità di comunicazione necessaria tra i nodi per sincronizzare i valori restituiti. Se devi determinare la "prima" o "ultima" riga, generalmente è meglio aggiungere una date o un timestamp colonna alla tabella e ordina in base a quella anziché presumere che la chiave primaria venga generata in sequenza.