Oracle e sequence

Spread the love
logo-oracle-largeMi è capitato un caso in cui un record inserito in una tabella intorno alle 12.00 porta un valore di chiave primaria, ottenuto leggendo una sequence, superiore del valore ottenuto dalla stessa sequence dopo circa mezzora:
        ID TEMPO
---------- -------------------
     65304 02/12/2015 10:55:27 
     65297 02/12/2015 12:37:38
Il mio DBA di fiducia mi ricorda che lo scopo della sequence è quella di fornire valori UNIVOCI, più che valori ordinati nel tempo, ma la cosa succede perché, nella definizione della sequence, ho dichiarato la direttiva NOORDER.
Questa direttiva, nel caso di DB in cluster a più nodi (nel mio caso la macchina che contiene il DB è bilanciata con 2 nodi: significa che c’è tra il database ed il client c’è un bilanciatore che decide se smistare le chiamate verso un nodo o verso il suo gemello identico a seconda del carico computazionale dei sottonodi), può portare a comportamenti di questo tipo (le sequence vengono staccate un po’ di qua un po di là ma il DB al momento della generazione non le ordina tra i vari nodi – questo il significato del NOORDER).
Per converso, non dichiarare la clausola NOORDER, affinché Oracle si preoccupi distribuire le sequenze in ordine, potrebbe portare a situazioni ben più gravi, come quella di mettere in LOCK il database (vedi ad esempio http://www.dba-oracle.com/t_rac_proper_sequence_usage.htm).
Una possibile soluzione, se si vuole che venga ricordato l’ordine di inserimento, sarebbe quella di prevedere un campo data valorizzato a sysdate al momento della creazione del record ed usare quello per l’ordinamento.

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.