Odzyskiwanie przestrzeni logicznej z obszaru tabel

11

Mam obszar tabel o nazwie DATA i jest on skonfigurowany z automatycznym rozszerzaniem jako false. Ten obszar tabel ma dwa pliki danych i jest skonfigurowany, więc zajmuje 350 GB miejsca fizycznego.

Tydzień temu sprawdziłem user_tablespaces i dba_data_files i zauważyłem, że ma 20% dostępnej przestrzeni logicznej. Następnie wykonałem procedurę czyszczenia i usunąłem wiele rekordów z tabel w tym obszarze tabel. Spodziewaliśmy się znacznego wzrostu dostępnej powierzchni. Niestety, kiedy zapytałem o wyświetlenia, zauważyłem, że dostępne miejsce wynosi teraz 20,5%.

Czy może to być spowodowane fragmentacją danych? Czy możemy jakoś „zdefragmentować” przestrzeń tabel i odzyskać utracone miejsce? Czy też musimy odtworzyć obszar tabel od zera?

Nuno Furtado
źródło

Odpowiedzi:

14

Kiedy usuwasz rekordy, nie ma nic, co automatycznie kompaktuje segment, dlatego musisz zrobić zmniejszenie segmentu, aby odzyskać miejsce. Oto fragment Przewodnika administratora 11.2 na temat odzyskiwania zużytej przestrzeni :

Z biegiem czasu aktualizacje i usuwanie obiektów w obszarze tabel mogą tworzyć kieszenie pustej przestrzeni, które indywidualnie nie są wystarczająco duże, aby ponownie wykorzystać je do nowych danych. Ten typ pustej przestrzeni jest nazywany fragmentaryczną wolną przestrzenią.

Obiekty z pofragmentowanym wolnym miejscem mogą powodować marnowanie miejsca i wpływać na wydajność bazy danych. Preferowanym sposobem defragmentacji i odzyskania tego miejsca jest wykonanie zmniejszenia segmentu online. Proces ten konsoliduje rozdrobnioną wolną przestrzeń poniżej znaku wysokiej wody i zagęszcza segment. Po zagęszczeniu znak wysokiej wody zostaje przesunięty, co powoduje powstanie nowej wolnej przestrzeni nad znakiem wysokiej wody. Ta przestrzeń powyżej znaku wysokiej wody zostaje następnie zwolniona. Segment pozostaje dostępny dla zapytań i DML przez większość operacji i nie trzeba przydzielać dodatkowego miejsca na dysku.

W dalszej części tej samej strony możesz przeczytać:

Obkurczanie segmentów jest operacją online na miejscu. Operacje i zapytania DML mogą być wydawane podczas fazy przenoszenia danych kurczących się segmentów. Współbieżne operacje DML są blokowane na krótki czas po zakończeniu operacji zmniejszania, gdy miejsce zostaje zwolnione. Indeksy są utrzymywane podczas operacji zmniejszania i pozostają użyteczne po zakończeniu operacji. Zmniejszenie segmentu nie wymaga przydzielenia dodatkowego miejsca na dysku.

Skurcz segmentowy odzyskuje niewykorzystane miejsce zarówno powyżej, jak i poniżej znaku wysokiej wody. Natomiast zwolnienie miejsca odzyskuje niewykorzystane miejsce tylko powyżej znaku wysokiej wody. W operacjach zmniejszania baza danych domyślnie zagęszcza segment, dostosowuje znak wysokiej wody i zwalnia odzyskane miejsce.

Strona zawiera znacznie więcej informacji na temat problemu, w tym przykłady.

Przydatna może być również sekcja Obszar segmentu i znak wysokiej wody” Przewodnika pojęć.

Leigh Riffel
źródło
9

Tak, będzie to spowodowane fragmentacją.

Aby odzyskać miejsce, najpierw uzyskaj listę tabel w obszarze tabel z następującym zapytaniem (ignorując partycje - edytuj swoje pytanie, jeśli ich używasz):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Następnie dla każdej tabeli włącz ruch wierszy:

alter table TABLEINDATAPARTITION enable row movement;

Następnie możesz zmniejszyć tabelę:

alter table TABLEINDATAPARTITION shrink space;

Następnie zmniejsz pliki danych za pomocą:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

Nazwy plików danych można uzyskać z DBA_DATA_FILESwidoku, o którym już wiesz.

Philᵀᴹ
źródło
Doskonała, praktyczna odpowiedź. +1
Leigh Riffel