sql >> Database >  >> RDS >> Oracle

Het ORA_ROWSCN-gedrag in Oracle begrijpen

Standaard ORA_ROWSCN wordt opgeslagen op blokniveau, niet op rijniveau. Het wordt alleen op rijniveau opgeslagen als de tabel oorspronkelijk is gebouwd met ROWDEPENDENCIES ingeschakeld. Ervan uitgaande dat u veel rijen van uw tabel in een enkel blok kunt plaatsen en dat u de APPEND niet gebruikt hint om de nieuwe gegevens boven de bestaande hoogwatermarkering van de tabel in te voegen, voegt u waarschijnlijk nieuwe gegevens in blokken in die al een aantal bestaande gegevens bevatten. Standaard verandert dat de ORA_ROWSCN van elke rij in het blok waardoor uw zoekopdracht meer rijen telt dan er daadwerkelijk zijn ingevoegd.

Sinds ORA_ROWSCN alleen gegarandeerd een bovengrens is voor de laatste keer dat er DML op een rij was, zou het veel gebruikelijker zijn om te bepalen hoeveel rijen er vandaag zijn ingevoegd door een CREATE_DATE toe te voegen kolom naar de tabel die standaard is ingesteld op SYSDATE of om te vertrouwen op SQL%ROWCOUNT na uw INSERT liep (ervan uitgaande natuurlijk dat u een enkele INSERT gebruikt statement om alle rijen in te voegen).

Over het algemeen gebruikt u de ORA_ROWSCN en de SCN_TO_TIMESTAMP functie zal een problematische manier zijn om te identificeren wanneer een rij is ingevoegd, zelfs als de tabel is gebouwd met ROWDEPENDENCIES . ORA_ROWSCN retourneert een Oracle SCN dat een systeemwijzigingsnummer is. Dit is een unieke identificatiecode voor een bepaalde wijziging (d.w.z. een transactie). Als zodanig is er geen directe link tussen een SCN en een tijd - mijn database genereert mogelijk een miljoen keer sneller SCN's dan de uwe en mijn SCN 1 kan jaren verschillen van uw SCN 1. Het Oracle-achtergrondproces SMON onderhoudt een tabel die SCN-waarden toewijst om tijdstempels te benaderen, maar het handhaaft die gegevens slechts voor een beperkte periode - anders zou uw database eindigen met een rijentabel van meerdere miljarden die alleen SCN opsloeg naar tijdstempeltoewijzingen. Als de rij meer dan bijvoorbeeld een week geleden is ingevoegd (en de exacte limiet hangt af van de database en databaseversie), SCN_TO_TIMESTAMP kan de SCN niet converteren naar een tijdstempel en geeft een foutmelding.




  1. Postgresql-transactieafhandeling met java

  2. SQL server 2005 gegevenstype voor datum

  3. SQLPlus probeert pakket twee keer te laten vallen

  4. Rails transacties