Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comprendre le comportement ORA_ROWSCN dans Oracle

Par défaut, ORA_ROWSCN est stocké au niveau du bloc, pas au niveau de la ligne. Il n'est stocké au niveau de la ligne que si la table a été créée à l'origine avec ROWDEPENDENCIES activé. En supposant que vous puissiez tenir plusieurs lignes de votre tableau dans un seul bloc et que vous n'utilisez pas le APPEND Pour insérer les nouvelles données au-dessus de la limite supérieure existante de la table, vous insérez probablement de nouvelles données dans des blocs qui contiennent déjà des données existantes. Par défaut, cela va changer le ORA_ROWSCN de chaque ligne du bloc, ce qui fait que votre requête compte plus de lignes que celles réellement insérées.

Depuis ORA_ROWSCN est uniquement garanti d'être une limite supérieure la dernière fois qu'il y avait DML sur une ligne, il serait beaucoup plus courant de déterminer combien de lignes ont été insérées aujourd'hui en ajoutant un CREATE_DATE colonne à la table qui par défaut est SYSDATE ou de s'appuyer sur SQL%ROWCOUNT après votre INSERT run (en supposant, bien sûr, que vous utilisiez un seul INSERT pour insérer toutes les lignes).

Généralement, en utilisant le ORA_ROWSCN et le SCN_TO_TIMESTAMP la fonction va être un moyen problématique d'identifier quand une ligne a été insérée même si la table est construite avec ROWDEPENDENCIES . ORA_ROWSCN renvoie un SCN Oracle qui est un numéro de modification système. Il s'agit d'un identifiant unique pour un changement particulier (c'est-à-dire une transaction). En tant que tel, il n'y a pas de lien direct entre un SCN et une heure - ma base de données peut générer des SCN un million de fois plus rapidement que la vôtre et mon SCN 1 peut différer d'années de votre SCN 1. Le processus d'arrière-plan Oracle SMON maintient une table qui mappe les valeurs SCN à des horodatages approximatifs, mais elle ne conserve ces données que pendant une période de temps limitée - sinon, votre base de données se retrouverait avec une table de plusieurs milliards de lignes qui ne faisait que stocker des mappages SCN à horodatage. Si la ligne a été insérée il y a plus d'une semaine (et la limite exacte dépend de la base de données et de la version de la base de données), SCN_TO_TIMESTAMP ne pourra pas convertir le SCN en horodatage et renverra une erreur.