检查空间使用情况时发现,最近一些自动扩展的表空间又增加了不少的空间,就查看了下库里有哪些大表;
SELECT (T.BYTES / 1024 / 1024) AS MB
FROM DBA_SEGMENTS T
WHERE T.OWNER IN ('ORADS', 'ORABW')
ORDER BY MB DESC;
或者用DBA_EXTENTS也可以查出分配了多大的空间
发现有两张表达到了四个多G的空间,并且都是一些普通的堆表,查看这两张表发现只有几十万的数据,并且每张表的列也不多,于是就在USER_TABLES里找其中一张表看一下真正占用的空间是多少大:
- - - - 先分析表
ANALYZE TABLE L2_GYLJRSS_CUSTOMER COMPUTE STATISTICS;
- - - - 查看实际占用情况
SELECT (NUM_ROWS * (AVG_ROW_LEN)) / 1024 / 1024 AS MB
FROM USER_TABLES
WHERE TABLE_NAME = 'L2_GYLJRSS_CUSTOMER';
查出的结果就60M 多一点,于是就做一下表收缩(表必须启用row movement & 表段所在表空间的段空间管理(segment space management)必须为auto)
ALTER TABLE L2_GYLJRSS_CUSTOMER ENABLE ROW MOVEMENT;
ALTER TABLE L2_GYLJRSS_CUSTOMER SHRINK SPACE;
这时再用第一条语句查看(表DBA_SEGMENTS 或DBA_EXTENTS)得到的结果就和在USER_TABLES中的结果差不多了;
再查看表空间的使用情况,那四个G的空间已经退换过去了;