Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verstehen des ORA_ROWSCN-Verhaltens in Oracle

Standardmäßig ORA_ROWSCN wird auf Blockebene gespeichert, nicht auf Zeilenebene. Sie wird nur dann auf Zeilenebene gespeichert, wenn die Tabelle ursprünglich mit ROWDEPENDENCIES erstellt wurde aktiviert. Angenommen, Sie können viele Zeilen Ihrer Tabelle in einem einzigen Block unterbringen und verwenden nicht das APPEND Hinweis zum Einfügen der neuen Daten über der vorhandenen oberen Grenze der Tabelle, fügen Sie wahrscheinlich neue Daten in Blöcke ein, die bereits einige vorhandene Daten enthalten. Standardmäßig wird dadurch ORA_ROWSCN geändert jeder Zeile im Block, was dazu führt, dass Ihre Abfrage mehr Zeilen zählt, als tatsächlich eingefügt wurden.

Seit ORA_ROWSCN garantiert nur eine Obergrenze für das letzte Mal, als DML in einer Zeile vorhanden war, wäre es viel üblicher, zu bestimmen, wie viele Zeilen heute eingefügt wurden, indem ein CREATE_DATE hinzugefügt wird Spalte in die Tabelle, die standardmäßig SYSDATE ist oder sich auf SQL%ROWCOUNT zu verlassen nach Ihrem INSERT ausgeführt (vorausgesetzt natürlich, Sie verwenden ein einzelnes INSERT Anweisung zum Einfügen aller Zeilen).

Im Allgemeinen mit dem ORA_ROWSCN und der SCN_TO_TIMESTAMP -Funktion wird eine problematische Methode sein, um zu identifizieren, wann eine Zeile eingefügt wurde, selbst wenn die Tabelle mit ROWDEPENDENCIES erstellt wurde . ORA_ROWSCN gibt eine Oracle-SCN zurück, die eine Systemänderungsnummer ist. Dies ist eine eindeutige Kennung für eine bestimmte Änderung (z. B. eine Transaktion). Daher gibt es keine direkte Verbindung zwischen einem SCN und einer Zeit – meine Datenbank generiert SCNs möglicherweise millionenfach schneller als Ihre, und mein SCN 1 unterscheidet sich möglicherweise um Jahre von Ihrem SCN 1. Der Oracle-Hintergrundprozess SMON verwaltet eine Tabelle, die SCN-Werte ungefähren Zeitstempeln zuordnet, aber diese Daten werden nur für einen begrenzten Zeitraum aufbewahrt - andernfalls würde Ihre Datenbank am Ende eine Tabelle mit mehreren Milliarden Zeilen enthalten, die nur SCN-zu-Zeitstempel-Zuordnungen speichert. Wenn die Zeile vor mehr als beispielsweise einer Woche eingefügt wurde (und das genaue Limit von der Datenbank und der Datenbankversion abhängt), SCN_TO_TIMESTAMP kann den SCN nicht in einen Zeitstempel umwandeln und gibt einen Fehler zurück.