博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

如何查询表空间使用情况

Posted on 2012-07-31 17:33  徐正柱-  阅读(1824)  评论(0编辑  收藏  举报

表空间的空间监控

表空间的空间使用其实是一个需要特别注意的问题,因为数据文件不可扩展而导致表空间的空间不够,可能导致无法写入任何新的数据,而甚至导致数据库的停止。以下的语句可以监控表空间的空间利用情况,如果使用了9i的完全临时表空间,则加入后半部分用于检测临时表空间。

SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,SPACE-NVL(FREE_SPACE,0) "USED_SPACE(M)",
ROUND((
1-NVL(FREE_SPACE,0)/SPACE)*100,2) "USED_RATE(%)",FREE_SPACE "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(
1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(
1024*1024),2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
--如果采用了完全本地管理的临时表空间,就加入如下部分
UNION ALL 
--if have tempfile
SELECT D.TABLESPACE_NAME,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",ROUND(NVL(USED_SPACE,
0)/SPACE*100,2) "USED_RATE(%)",
NVL(FREE_SPACE,
0) "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/(
1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,ROUND(SUM(BYTES_USED)/(
1024*1024),2) USED_SPACE,
ROUND(SUM(BYTES_FREE)/(
1024*1024),2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)

 

段的空间利用监控

段的空间与区间的利用,在字典管理的表空间有尤为重要,如果一个对象的区间数太多,不但大大加重了字典表的管理负担与系统回滚段的压力,也严重影响对该段(如表或索引)的性能。该查询也可以看到现在利用的区间与最大区间数的差异,如果该差值已经很小,就需要注意新的空间的分配,避免因为不能分配新的区间而导致新数据的写入错误。

SELECT S.OWNER,S.SEGMENT_NAME,S.SEGMENT_TYPE,S.PARTITION_NAME,
ROUND(BYTES/(
1024*1024),2) "USED_SPACE(M)",
EXTENTS USED_EXTENTS,S.MAX_EXTENTS,S.BLOCKS ALLOCATED_BLOCKS,
S.BLOCKS USED_BOLCKS,S.PCT_INCREASE,S.INITIAL_EXTENT,
S.NEXT_EXTENT/
1024 "NEXT_EXTENT(K)",S.TABLESPACE_NAME
FROM DBA_SEGMENTS S
WHERE S.OWNER = USER
ORDER BY Used_Extents DESC