上一篇我们讲了如何查看占用DB空间大的分区表,我们现在来讲空间进行删除用来节省数据库空间
1.查询表空间
/*查询表空间*/
SELECT SEGMENT_NAME,
(SUM(BYTES) / 1024 / 1024 ) AS TABLE_SIZE_MB
FROM USER_EXTENTS
GROUP BY SEGMENT_NAME
ORDER BY TABLE_SIZE_MB DESC;
发现SYS_LOB0000091343C00005$$空间占用很大
2.查询Lob空间所在的表
/*查找表结构信息*/
SELECT * FROM DBA_LOBS WHERE SEGMENT_NAME = 'SYS_LOB0000091343C00005$$';
表:ET_MAIL_INFO的MAIL_BODY使用了BLOB从而占用了大量数据库空间
3. 查看表分区
4. 查询分区表的情况,生成清除指定某个分区表的分区数据的SQL,可以在USER_TAB_PARTITIONS中查询。
--查询分区表的PT01_CREATE_TIME情况,可以在USER_TAB_PARTITIONS中查询。
select 'truncate' as action,
'alter table ' || t.table_name || ' truncate partition ' ||
t.partition_name as Action_SQL
from USER_TAB_PARTITIONS t
where t.table_name = 'ET_MAIL_INFO'
AND t.partition_name = 'PT01_CREATE_TIME'
union
select 'drop' as action,
'alter table ' || t.table_name || ' drop partition ' ||
t.partition_name as Action_SQL
from USER_TAB_PARTITIONS t
where t.table_name = 'ET_MAIL_INFO'
AND t.partition_name = 'PT01_CREATE_TIME';
5.清除表分区数据及占用空间
--清除表分区数据
alter table ET_MAIL_INFO truncate partition PT01_CREATE_TIME;
--清除分区占用的空间:
alter table ET_MAIL_INFO drop partition PT01_CREATE_TIME;
6.删除数据及表空间后,必需要进行表分析,查看表相关索引等信息是否有效。
释放表空间后,表的行号rowid会发生变化,而基于rowid的索引则会变成无效。因此该操作后必须重建索引。
否则会 提示“ORA-01502: 索引'*********'或这类索引的分区处于不可用状态”
--分析表
analyze table ET_MAIL_INFO compute statistics;
分析时发现表索引有问题,
7.查看表相关的索引
重建索引的方法当然可以先drop掉再create,也可以用rebuild(推荐使用,速度快且不会改变原来的索引结构)
--重建索引的方法当然可以先drop掉再create,也可以用rebuild(推荐使用,速度快且不会改变原来的索引结构)
alter index PK_ET_MAIL_INFO rebuild;
alter index IDX1_MAIL_INFO rebuild;
alter index IDX2_MAIL_INFO rebuild;
alter index IDX3_MAIL_INFO rebuild;
8,再次分析表后,发现索引正常,再次执行空间查询语句,发现空间变小了,只有352MB了