Уменьшение размера таблицы без удаления данных
Стоит вопрос об уменьшении размера таблиц в БД, т.к. утилизация достигла пиковых значений.
Возможно ли "сжать" таблицы без потери данных?
Например, в БД осталось 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