Уменьшение размера таблицы без удаления данных

Стоит вопрос об уменьшении размера таблиц в БД, т.к. утилизация достигла пиковых значений.

Возможно ли "сжать" таблицы без потери данных?


Например, в БД осталось 10 Гб свободного места, а несколько таблиц занимают по 5 Гб. Хотел бы их "сжать" без удаления данных из таблиц.


Ответы (1 шт):

Автор решения: 0xdb

Сначала попробуйте избавится от фрагментации таблицы, возникшей из-за частых DML.

Таблица для примера:

create table bigtab (id, val) as
    select level, rpad ('A', 200, 'X') 
    from dual connect by level<=1e6
/
create index bigtabidx on bigtab (val)
/
delete from bigtab where mod (id,2) = 0 
/

500,000 rows deleted.

Найдите большие таблицы таким запросом:

select segment_name, segment_type, tablespace_name, round (bytes/1024/1024,2) sizemb
from  user_segments
where bytes > 100*1024*1024
order by sizemb desc
fetch first 5 rows only
/
SEGMENT_NAME     SEGMENT_TYPE       TABLESPACE_NAME      SIZEMB
---------------- ------------------ ---------------- ----------
BIGTABIDX        INDEX              USERS                   247
BIGTAB           TABLE              USERS                   232

Теперь, перестройте таблицу влючая зависимые сегменты. Для этого надо разрешить перемещение записей внутри сегмента. Запрос выше покажет, что удалось, как и ожидалось, освобдить ~50% места:

alter table bigtab enable row movement
/
alter table bigtab shrink space cascade   
/

SEGMENT_NAME     SEGMENT_TYPE       TABLESPACE_NAME      SIZEMB
---------------- ------------------ ---------------- ----------
BIGTABIDX        INDEX              USERS                122,94
BIGTAB           TABLE              USERS                116,19

→ Ссылка