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

Comprensione del comportamento di ORA_ROWSCN in Oracle

Per impostazione predefinita, ORA_ROWSCN viene memorizzato a livello di blocco, non a livello di riga. Viene memorizzato solo a livello di riga se la tabella è stata originariamente creata con ROWDEPENDENCIES abilitato. Supponendo che tu possa inserire molte righe della tua tabella in un unico blocco e che non stai usando APPEND suggerimento per inserire i nuovi dati sopra l'high water mark esistente della tabella, è probabile che tu stia inserendo nuovi dati in blocchi che contengono già alcuni dati esistenti. Per impostazione predefinita, ciò cambierà il ORA_ROWSCN di ogni riga del blocco facendo sì che la tua query conteggi più righe di quante ne siano state effettivamente inserite.

Da ORA_ROWSCN è garantito che sia un limite superiore solo l'ultima volta che è stato visualizzato DML su una riga, sarebbe molto più comune determinare quante righe sono state inserite oggi aggiungendo un CREATE_DATE colonna alla tabella che per impostazione predefinita è SYSDATE o fare affidamento su SQL%ROWCOUNT dopo il tuo INSERT eseguito (supponendo, ovviamente, che tu stia utilizzando un singolo INSERT istruzione per inserire tutte le righe).

In genere, utilizzando il ORA_ROWSCN e il SCN_TO_TIMESTAMP funzione sarà un modo problematico per identificare quando è stata inserita una riga anche se la tabella è stata creata con ROWDEPENDENCIES . ORA_ROWSCN restituisce un Oracle SCN che è un numero di modifica del sistema. Questo è un identificatore univoco per una particolare modifica (cioè una transazione). Pertanto, non esiste un collegamento diretto tra un SCN e un'ora:il mio database potrebbe generare SCN un milione di volte più rapidamente del tuo e il mio SCN 1 potrebbe essere diverso da quello SCN 1. Il processo in background Oracle SMON mantiene una tabella che associa i valori SCN a timestamp approssimativi ma mantiene quei dati solo per un periodo di tempo limitato, altrimenti il ​​tuo database finirebbe con una tabella di righe multimiliardari che memorizzava solo SCN per mappature di timestamp. Se la riga è stata inserita più di, diciamo, una settimana fa (e il limite esatto dipende dal database e dalla versione del database), SCN_TO_TIMESTAMP non sarà in grado di convertire l'SCN in un timestamp e restituirà un errore.