SHRINK SPACE оперативное сжатие сегмента

Почему поиск в таблице с небольшим количеством строк может отнять довольно много времени?

Если в таблице когда-то было большое количество строк, поиск может замедлиться, потому что Oracle должен просмотреть каждый блок, в котором когда-либо содержались данные – вплоть до маркера максимального заполнения таблицы (High Water Mark – HWM).
Способы ускорить таблицу:
1. drop and recreate (exp/imp)
2. truncate (exp the data, truncate it, imp the data)
3. alter TABLE move + rebuild indexes
4. SHRINK SPACE — Online Segment Shrink (оперативное сжатие сегмента) появилась в 10G
5. DBMS_REDEFINITION

ALTER TABLE имя_таблицы SHRINK SPACE [COMPACT] [CASCADE];
Задание этой команды без опций приводит к дефрагментации таблицы и уплотнению ее строк.
Затем HWM корректируется к новой высокой позиции и освобождает высвободившееся пространство.
Опция COMPACT проводит дефрагментацию, но не корректирует HWM.
Опция CASCADE сжимает не только названную таблицу, но и любые зависимые объекты, например, индексы.
Поскольку перемещенные строки будут иметь новый ROWID,
Вы должны отключить любые триггеры, которые срабатывают на основании ROWID, или они будут выполнены повторно.
Имеются также и другие ограничения: проконсультируйтесь в документации.

Пример с TRUNCATE:

  1. LOCK TABLE ZTABLE
  2. IN EXCLUSIVE MODE
  3. NOWAIT;
  4. create table ZTABLE2 #b1b100;">AS select t.* from ZTABLE t;
  5. truncate table ZTABLE;
  6. insert into ZTABLE select * from ZTABLE2;
  7. commit;
  8. commit;
  9.  

Пример в SHRINK SPACE:

  1. --узнать размер таблицы до
  2. select round(bytes /#cc66cc;">1024/#cc66cc;">1024, #cc66cc;">2) mb
  3. from dba_segments
  4. WHERE segment_name = upper('zrepl_msg_i');
  5. alter table zrepl_msg_i enable row movement;
  6. ALTER TABLE zrepl_msg_i SHRINK SPACE;
  7. alter table zrepl_msg_i disable row movement;
  8. --узнать размер таблицы после
  9. select round(bytes /#cc66cc;">1024/#cc66cc;">1024, #cc66cc;">2) mb
  10. from dba_segments
  11. WHERE segment_name = upper('zrepl_msg_i');
  12.  

Пример для партицированной таблицы

  1. ALTER TABLE наименование_таблицы modify partition наименование_партиции SHRINK SPACE;
  2.  
Источники
http://mazdik.ru/?p=410 https://mmokaev.blogspot.ru/2015/11/plsql-oracle-shrink-tablespace.html http://www.fors.ru/upload/magazine/09/http_text/miheichev_20140224_LOB1.html http://www.sql.ru/forum/558061/obyasnite-pozhaluysta-nekotorye-momenty-alter-table-shrink
14:53
13.6K
Нет комментариев. Ваш будет первым!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.