2009-01-12 13 views
13

AFAIK ROWID w Oracle reprezentuje fizyczną lokalizację rekordu w odpowiednim pliku danych. W jakich przypadkach ROWID rekordu może się zmienić?Co może spowodować zmianę Oracle ROWID?

Znany mi jest UPDATE na partycjonowanym stole, który "przenosi" rekord na inną partycję.

Czy są inne przypadki? Większość naszych DB to Oracle 10.

Odpowiedz

30

Jak pan powiedział, że wystąpi w najbliższym wiersz jest fizycznie przeniesiony na dysku, takich jak:

  • Eksport/import tabeli
  • ALTER TABLE MOVE XXXX
  • ALTER Tabela XXX Kurczenia SPACE
  • RETROSPEKCJA Tabela XXX
  • Rozdzielanie przegroda
  • aktualizacji wartości tak, że przesuwa się nowa partycja
  • Łącząc dwie partycje

Jeśli jest w tabeli indeksu zorganizowane, a następnie aktualizacja do klucza podstawowego nie daje innej ROWID jak również.

+1

Również UPDATEing (poprzednia wartość NULL, na przykład) może spowodować, że wiersz będzie wystarczająco duży, aby nie mógł być już umieszczony na bieżącej stronie. W aplikacji, w której występuje duża liczba UPDATE, prawdopodobnie byłoby to dość powszechne. –

+2

Mike, to doprowadziłoby do łączenia łańcuchów. Widoczny rząd ROWID nie zmienia się, ale w rekordzie dostajemy wskaźnik do innego bloku, w którym znajduje się pełny rekord. –

+2

Byłaby to migracja szeregowa, która ma miejsce, gdy wiersz staje się zbyt duży dla bieżącego bloku, ale jest wystarczająco duży, aby pomieścić się w jednym bloku. Łańcuchowanie występuje, gdy wiersz jest zbyt duży dla pojedynczego bloku. Ale masz rację, że wskaźnik do przeniesionego wiersza jest pozostawiony w oryginalnym bloku. –

8

+1 @WW

Tak na marginesie:

ROWID dla indeksu zorganizowane tabel są różne (są one nazywane UROWID, wierzę), ponieważ fizyczna lokalizacja rzędu mogą ulec zmianie w trakcie aktualizacji do tabela (gdy węzły drzewa są podzielone lub połączone).

Aby indeksowanie było nadal możliwe, identyfikator UROWID zawiera "identyfikator logiczny" (klucz podstawowy) i "prawdopodobny identyfikator fizyczny" (zwykły identyfikator ROWID), z którego ten ostatni może wygasnąć.

8

Another +1 do WW, ale wystarczy dodać trochę więcej ...

Jeśli pytanie brzmi, czy jazdy można przechowywać ROWIDs do późniejszego wykorzystania, powiedziałbym „nie rób tego”.

Jesteś w porządku używać ROWIDs ramach transakcji - na przykład zbierając komplet ROWIDs na których można przeprowadzić kolejne operacje - ale należy nigdy przechowują ROWIDs w tabeli i zakładamy, że będziemy mieć OK do użycia w późniejszym terminie.

+0

Korzystając z funkcji powiadomienia o zmianie bazy danych Oracle, jedyną informacją, którą sterownik jdbc Oracle ujawnia po zmianie wiersza, jest ROWID. Wierzę, że poleganie na ROWID to stabilne rozwiązanie. Jeśli nie zmienisz swojej tabeli między transakcjami. – Anton

Powiązane problemy