Дефрагментация с помощью ALTER TABLE MOVE

Скрипт одного из способов (их всего 5) дефрагментации таблиц и индексов в oracle. Находит таблицы размер которых 10Мб и процент дефрагментации 50%. В цикле для этих таблиц выполняется ALTER TABLE MOVE и REBUILD всех его индексов. Обновляется статистика DBMS_STATS.GATHER_TABLE_STATS.

begin
for cur in (
SELECT T.* FROM (
SELECT TABLE_NAME, ROUND((BLOCKS*8),2) "SIZE_KB",
ROUND((NUM_ROWS*AVG_ROW_LEN/1024),2) "SIZEREAL_KB",
ROUND((BLOCKS*8),2)-ROUND((NUM_ROWS*AVG_ROW_LEN/1024),2) "BEZTOLKY_KB",
ROUND((ROUND((BLOCKS*8),2)-ROUND((NUM_ROWS*AVG_ROW_LEN/1024),2))*100/DECODE(ROUND((BLOCKS*8),2), 0, 1, ROUND((BLOCKS*8),2)), 2) "PERC"
FROM USER_TABLES) T
WHERE T.BEZTOLKY_KB>10000
AND T.PERC>50 )
loop
execute immediate 'ALTER TABLE '||cur.table_name||' MOVE';
begin
for cur_indx in (SELECT STATUS, INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = cur.table_name)
loop
execute immediate 'ALTER INDEX '||cur_indx.INDEX_NAME||' REBUILD';
end loop;
end;
begin
DBMS_STATS.GATHER_TABLE_STATS(user,cur.table_name);
end;
end loop;
end;

Способы дефрагментации:
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 появилась в 10G
5. DBMS_REDEFINITION