Почему поиск в таблице с небольшим количеством строк может отнять довольно много времени?
Если в таблице когда-то было большое количество строк, поиск может замедлиться, потому что 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:
LOCK TABLE ZTABLE
IN EXCLUSIVE MODE
NOWAIT;
create table ZTABLE2 #b1b100;">AS select t.* from ZTABLE t;
truncate table ZTABLE;
insert into ZTABLE select * from ZTABLE2;
commit;
commit;
Пример в SHRINK SPACE:
--узнать размер таблицы до
select round(bytes /#cc66cc;">1024/#cc66cc;">1024, #cc66cc;">2) mb
from dba_segments
WHERE segment_name = upper('zrepl_msg_i');
alter table zrepl_msg_i enable row movement;
ALTER TABLE zrepl_msg_i SHRINK SPACE;
alter table zrepl_msg_i disable row movement;
--узнать размер таблицы после
select round(bytes /#cc66cc;">1024/#cc66cc;">1024, #cc66cc;">2) mb
from dba_segments
WHERE segment_name = upper('zrepl_msg_i');
Пример для партицированной таблицы
ALTER TABLE наименование_таблицы modify partition наименование_партиции SHRINK SPACE;
Источники
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