10 мая 2011 г.

oracle: ALTER TABLE ... MOVE


Важно. При использании ALTER TABLE ... MOVE нужно пересоздавать индексы этой таблицы.

Эта команда перемещает HWM в таблице до уровня занятых блоков. Например, в таблице HWM было на уровне 16 блоков, но потом в рез-те разных операций, занятых блоков осталось 12, но HWM остаётся на уровне 16, вот чтобы переместить HWM на уровень 12 блоков и увеличить кол-во unused blocks используется alter table move.
Но кол-во пространства, которое занимает таблица не меняется!!!

Перенести таблицу в другое табличное пространство

-- создаём табличное пространство
CREATE TABLESPACE GUPPI_TEST
DATAFILE  '/data/GUPPI/guppi_test.dbf' SIZE 1000M AUTOEXTEND OFF;

-- проверяем в каком tablespace таблица до MOVE
select * from dba_segments where segment_name='T';
select * from dba_tables where table_name='T';

-- проверяем индексы
-- check index status
select index_name,status from dba_indexes where table_name
in ('T','CDR_UNBILLED','CDR_DATA_DUC','CDR_BILLED');
-- check index status for partition
select index_name,partition_name,status from dba_ind_partitions
where partition_name like 'T%' ;


-- перемещаем таблицу в другое tablespace
alter table guppi.t move tablespace guppi_test;

-- если много таблиц, то можно сгенерить команды
select 'alter table quest.'|| table_name || ' move;' from dba_tables where owner='QUEST';


-- проверяем в каком tablespace таблица после MOVE
select * from dba_segments where segment_name='T';
select * from dba_tables where table_name='T';


-- пересоздаём индексы таблицы, если они там были
 -- в этом примере пересоздаём индексы и переносим их в другое табличное пространство
alter index guppi.object_id_idx rebuild tablespace guppi_test online;

-- если много таблиц, то можно сгенерить команды
select 'alter index quest.'|| index_name || ' rebuild online;' from dba_indexes where owner='QUEST';


-- проверяем индексы
select index_name,status from dba_indexes where table_name='T';