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

Forståelse af ORA_ROWSCN-adfærden i Oracle

Som standard er ORA_ROWSCN gemmes på blokniveau, ikke på rækkeniveau. Den er kun gemt på rækkeniveau, hvis tabellen oprindeligt blev bygget med ROWDEPENDENCIES aktiveret. Forudsat at du kan passe mange rækker af din tabel i en enkelt blok, og at du ikke bruger APPEND tip til at indsætte de nye data over det eksisterende højvandsmærke i tabellen, indsætter du sandsynligvis nye data i blokke, der allerede har nogle eksisterende data i dem. Som standard vil det ændre ORA_ROWSCN af hver række i blokken, hvilket får din forespørgsel til at tælle flere rækker, end der faktisk blev indsat.

Siden ORA_ROWSCN er kun garanteret en øvre grænse sidste gang, der var DML på en række, ville det være meget mere almindeligt at bestemme, hvor mange rækker der blev indsat i dag ved at tilføje en CREATE_DATE kolonne til tabellen, der som standard er SYSDATE eller for at stole på SQL%ROWCOUNT efter din INSERT kørte (under forudsætning af, selvfølgelig, at du bruger en enkelt INSERT sætning for at indsætte alle rækkerne).

Generelt bruger du ORA_ROWSCN og SCN_TO_TIMESTAMP funktion vil være en problematisk måde at identificere, hvornår en række blev indsat, selvom tabellen er bygget med ROWDEPENDENCIES . ORA_ROWSCN returnerer et Oracle SCN, som er et systemændringsnummer. Dette er en unik identifikator for en bestemt ændring (dvs. en transaktion). Som sådan er der ingen direkte forbindelse mellem et SCN og et tidspunkt - min database genererer muligvis SCN'er en million gange hurtigere end din, og min SCN 1 kan være år forskellig fra din SCN 1. Oracle-baggrundsprocessen SMON vedligeholder en tabel, der kortlægger SCN-værdier til omtrentlige tidsstempler, men den vedligeholder kun disse data i en begrænset periode - ellers ville din database ende med en tabel med flere milliarder rækker, der blot lagrede SCN til tidsstempler. Hvis rækken blev indsat for mere end f.eks. en uge siden (og den nøjagtige grænse afhænger af databasen og databaseversionen), SCN_TO_TIMESTAMP vil ikke være i stand til at konvertere SCN til et tidsstempel og vil returnere en fejl.




  1. mysql ekstrakt år fra dato format

  2. Forskel mellem understreng i Postgresql

  3. Sådan får du månedens ugenummer fra datoen i sql server 2008

  4. Informationssystemer, data og information