Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zrozumienie zachowania ORA_ROWSCN w Oracle

Domyślnie ORA_ROWSCN jest przechowywany na poziomie bloku, a nie na poziomie wiersza. Jest przechowywany na poziomie wiersza tylko wtedy, gdy tabela została pierwotnie zbudowana przy użyciu ROWDEPENDENCIES włączony. Zakładając, że możesz zmieścić wiele wierszy tabeli w jednym bloku i że nie używasz APPEND wskazówka, aby wstawić nowe dane powyżej istniejącego wysokiego znaku wodnego w tabeli, prawdopodobnie wstawiasz nowe dane do bloków, w których są już jakieś istniejące dane. Domyślnie zmieni to ORA_ROWSCN każdego wiersza w bloku, co powoduje, że zapytanie liczy więcej wierszy, niż zostało faktycznie wstawionych.

Od ORA_ROWSCN gwarantowane jest tylko górne ograniczenie ostatniego czasu, gdy w wierszu był DML, znacznie częściej byłoby określać, ile wierszy zostało wstawionych dzisiaj, dodając CREATE_DATE kolumna do tabeli, która domyślnie SYSDATE lub polegać na SQL%ROWCOUNT po INSERT uruchomiony (zakładając oczywiście, że używasz pojedynczego INSERT oświadczenie, aby wstawić wszystkie wiersze).

Ogólnie, używając ORA_ROWSCN i SCN_TO_TIMESTAMP funkcja będzie problematycznym sposobem identyfikowania, kiedy wiersz został wstawiony, nawet jeśli tabela jest zbudowana za pomocą ROWDEPENDENCIES . ORA_ROWSCN zwraca Oracle SCN, który jest numerem zmiany systemu. Jest to unikalny identyfikator konkretnej zmiany (tj. transakcji). W związku z tym nie ma bezpośredniego związku między SCN a czasem — moja baza danych może generować SCN milion razy szybciej niż Twoja, a mój SCN 1 może różnić się o lata od twojego SCN 1. Proces Oracle w tle SMON utrzymuje tabelę, która odwzorowuje wartości SCN na przybliżone znaczniki czasu, ale przechowuje te dane tylko przez ograniczony czas — w przeciwnym razie Twoja baza danych otrzymałaby wielomiliardową tabelę, która po prostu przechowywała odwzorowania SCN na znaczniki czasu. Jeśli wiersz został wstawiony więcej niż, powiedzmy, tydzień temu (a dokładny limit zależy od bazy danych i wersji bazy danych), SCN_TO_TIMESTAMP nie będzie w stanie przekonwertować SCN na znacznik czasu i zwróci błąd.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. poprawka wstępna

  2. Baza danych Oracle TNS Długość wartości klucza „źródło danych” przekracza limit „128”

  3. Konwertuj nowy wiersz na XML wewnątrz wyzwalacza Oracle

  4. Przyznaj wszystkie uprawnienia użytkownikowi na schemacie Oracle

  5. Wywołanie procedury PL/SQL z rekordem zdefiniowanym przez użytkownika jako parametrem IN przy użyciu JDBC