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

Oracle RAC e sequenze

Cosa intendi esattamente per "ordinato" in questo contesto?

Per impostazione predefinita, ogni nodo del cluster dispone di una cache separata di numeri di sequenza. Quindi il nodo 1 potrebbe distribuire i valori 1-100 mentre il nodo 2 distribuisce i valori 101-200. I valori restituiti da un singolo nodo sono sequenziali, ma la sessione A sul nodo 1 può ottenere un valore di 15 mentre la sessione B sul nodo 2 ottiene un valore di 107, quindi i valori restituiti tra le sessioni appaiano fuori ordine.

Se specifichi che la sequenza deve essere ordinata, stai praticamente vanificando lo scopo della cache della sequenza perché Oracle ora deve comunicare tra i nodi ogni volta che richiedi un nuovo valore di sequenza. Ciò ha il potenziale per creare una discreta quantità di sovraccarico delle prestazioni. Se stai utilizzando la sequenza come una sorta di timestamp, tale sovraccarico potrebbe essere necessario ma in genere non è desiderabile.

La differenza di overhead in termini pratici dipenderà fortemente dall'applicazione:sarà smisuratamente piccola per alcune applicazioni e un problema significativo per altre. Contribuiranno anche il numero di nodi RAC, la velocità dell'interconnessione e la quantità di traffico di interconnessione presente. E poiché si tratta principalmente di un problema di scalabilità, l'effetto pratico limiterà la scalabilità dell'applicazione che è intrinsecamente non lineare. Raddoppiare il volume delle transazioni che la tua applicazione gestisce comporterà molto più del doppio dell'overhead.

Se si specifica NOCACHE, la scelta di ORDER o NOORDER è sostanzialmente irrilevante. Se si specifica ORDER, la scelta di CACHE o NOCACHE è sostanzialmente irrilevante. Quindi CACHE NOORDER è di gran lunga il più efficiente, gli altri tre sono relativamente intercambiabili. Implicheranno tutti il ​​coordinamento tra i nodi e il traffico di rete ogni volta che si richiede un valore di sequenza che è, ovviamente, un potenziale collo di bottiglia.

In genere sarebbe preferibile aggiungere una colonna TIMESTAMP alla tabella per memorizzare il timestamp effettivo piuttosto che fare affidamento sulla sequenza per fornire un ordine di timestamp.