Shrink або move lob сегмента - dmitry bobrovsky blogdmitry bobrovsky blog

У статті описано як звільнити місце в табличному просторі за рахунок LOB сегмент

Можна перемістити LOB сегмент в табличний простір, яке розташовуються на більш повільних пристроях зберігання, але великих за обсягом і відносно дешевих.

Щоб звільнити місце в табличному просторі за рахунок LOB сегмента, можна використовувати три способи:
A) Звільнити неиспользуемое місце вище High Water Mark (HWM).
B) Зробити SHRINK. У сегменті звільнитися неиспользуемое місце і місце під віддаленими даними.
C) Фізично перемістити LOB сегмент в інше табличний простір.

УВАГА: Під час виконання запитів із способів B) і C) LOB сегмент блокується. Якщо LOB сегмент великий, то це може зайняти значний час. Тому ці операції рекомендується проводити у поза робочий час.

Спочатку визначаємо, з якими сегментами ми будемо працювати
0) Визначаємо розмір LOB сегментів, щоб зрозуміти які з них найбільші

1) Сегмент може займати більше місця, ніж в ньому міститься даних. Цим запитом можна визначити, який обсяг пам'яті реальні дані конкретного сегмента.
Якщо місце займане даними набагато менше самого сегмента, значить є вільне місце в самому сегменті і його можна спробувати звільнити способами A) і B)
Якщо дані займають весь сегмент - значить щоб звільнити місце в табличному просторі його потрібно переносити в інше табличний простір.
Замість змінних підставити:
- поле table_name із запиту 0
- поле segment_name із запиту 0

A.1) Процедура показує, скільки місця можна звільнити командою ALTER TABLE ... DEALLOCATE UNUSED.
Якщо такого місця багато і ви хочете звільнити його - виконайте A.2.
Якщо такого місця мало тоді місце використовуйте способи B) або С).

A.2) Якщо такого місця багато його можна звільнити командою
- поле table_name із запиту 0
- поле COLUMN_NAME із запиту 0
alter table ELA_DOCUMENT modify lob (ELADO_BYTES) (deallocate unused);

B.1) Процедура показує, скільки місця можна звільнити командою ALTER TABLE ... DEALLOCATE UNUSED.
Якщо такого місця багато і ви хочете звільнити його - виконайте A.2.
Якщо такого місця мало тоді місце іспользутся способи B) або С).
- поле table_name із запиту 0
- поле COLUMN_NAME із запиту 0
alter table ELA_DOCUMENT modify lob (ELADO_BYTES) (shrink space);
alter table ELA_DOCUMENT modify lob (ELADO_BYTES) (shrink space cascade);
Опція cascade - застосовує SHRINK не тільки до LOB сегменту але і до пов'язаних з ним LOB індексам

C.1) Запит яким LOB сегмент переноситися в інше табличний простір
Замість змінних підставити:
- поле table_name із запиту 0
- поле COLUMN_NAME із запиту 0
- ім'я табличного простору в яке ви хочете перенести LOB сегмент
ALTER TABLE ELA_DOCUMENT MOVE LOB (ELADO_BYTES) STORE AS (TABLESPACE DATA2);