--1.查看索引和表的初始大小
SELECT bytes/1024/1024 ||'M' TABLE_SIZE ,u.* FROM dba_SEGMENTS U
WHERE U.owner IN ('CLEAR','TRADE','INTERFACE','SECURITY')
ORDER BY 1 DESC
--2. 通过上面语句找到占用空间较大的表,删除表记录
DELETE
FROM CLEAR.TC_SYSCFEE_INQUIRE_FEE_DETAIL t
WHERE t.trade_date <'20180101';
--3.消除行迁移,清除空间碎片,删除空闲空间,实现缩小所占的空间
alter table CLEAR.TC_SYSCFEE_INQUIRE_FEE_DETAIL move
/*因为alter table jk_test move 是通过消除行迁移,清除空间碎片,删除空闲空间,实现缩小所占的空间,但会导致此表上的索引无效(因为ROWID变了,无法找到),
所以执行 move 就需要重建索引。
找到表对应的索引。
select index_name,table_name,tablespace_name,index_type,status from dba_indexes where table_owner='SCOTT' ;
根据status 的值,重建无效的就行了。
sql='alter index '||index_name||' rebuild'; 使用存储过程执行。
还要注意alter table move过程中会产生锁,应该避免在业务高峰期操作!*/
--4.删除主键
ALTER TABLE CLEAR.TC_SYSCFEE_INQUIRE_FEE_DETAIL DROP PRIMARY KEY DROP INDEX;
--5.重新建主键
alter table CLEAR.TC_SYSCFEE_INQUIRE_FEE_DETAIL
add constraint PK_SYSCFEE_INQUIRE_FEE_DETAIL primary key (TRADE_DATE, SEQ_NO);
--6.原建表初始化大小为10M,每次增加5M,会造成空间浪费,例如只要往表中插入一条数据,就会占用10M的空间
--故修改设置 表和索引 initial初始化大小为1M,之后每次增加1M。
select 'ALTER TABLE '||owner||'.'||table_name||' MOVE TABLESPACE '||tablespace_name||' STORAGE(INITIAL 1M NEXT 1M);'
from dba_tables
where owner='CLEAR' ;
select 'ALTER INDEX '||owner||'.'||index_name||' REBUILD STORAGE(INITIAL 1M NEXT 1M);'
from dba_indexes
where owner='CLEAR'
--重建索引
SELECT 'alter index CLEAR.' || t.index_name ||' rebuild;' FROM dba_indexes t WHERE t.owner ='CLEAR';