sql >> Base de Datos >  >> RDS >> Oracle

Comprender el comportamiento de ORA_ROWSCN en Oracle

Por defecto, ORA_ROWSCN se almacena a nivel de bloque, no a nivel de fila. Solo se almacena en el nivel de fila si la tabla se creó originalmente con ROWDEPENDENCIES activado. Suponiendo que puede colocar muchas filas de su tabla en un solo bloque y que no está usando el APPEND sugerencia para insertar los nuevos datos por encima de la marca de límite superior existente de la tabla, es probable que esté insertando nuevos datos en bloques que ya tienen algunos datos existentes en ellos. Por defecto, eso va a cambiar el ORA_ROWSCN de cada fila en el bloque, lo que hace que su consulta cuente más filas de las que realmente se insertaron.

Desde ORA_ROWSCN solo se garantiza que sea un límite superior en la última vez que hubo DML en una fila, sería mucho más común determinar cuántas filas se insertaron hoy agregando un CREATE_DATE columna a la tabla que por defecto es SYSDATE o confiar en SQL%ROWCOUNT después de su INSERT corrió (asumiendo, por supuesto, que está usando un solo INSERT instrucción para insertar todas las filas).

Generalmente, usando el ORA_ROWSCN y el SCN_TO_TIMESTAMP va a ser una forma problemática de identificar cuándo se insertó una fila incluso si la tabla está construida con ROWDEPENDENCIES . ORA_ROWSCN devuelve un Oracle SCN que es un número de cambio del sistema. Este es un identificador único para un cambio en particular (es decir, una transacción). Como tal, no existe un vínculo directo entre un SCN y una hora:mi base de datos podría estar generando SCN un millón de veces más rápido que la suya y mi SCN 1 puede tener años de diferencia con su SCN 1. El proceso en segundo plano de Oracle SMON mantiene una tabla que asigna valores de SCN a marcas de tiempo aproximadas, pero solo mantiene esos datos durante un período de tiempo limitado; de lo contrario, su base de datos terminaría con una tabla de miles de millones de filas que solo almacenaba asignaciones de SCN a marcas de tiempo. Si la fila se insertó hace más de, digamos, una semana (y el límite exacto depende de la base de datos y la versión de la base de datos), SCN_TO_TIMESTAMP no podrá convertir el SCN en una marca de tiempo y devolverá un error.