ITPub博客

首页 > 数据库 > Oracle > Oracle 查询各表空间使用情况--完善篇

Oracle 查询各表空间使用情况--完善篇

原创 Oracle 作者:maohaiqing0304 时间:2015-08-13 18:15:12 0 删除 编辑


标题: Oracle 查询各表空间使用情况--完善篇

作者:lōττéry©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]



前言 :
  之前简单写过"Oracle 查询各个 “表空间/数据文件” 的空间使用比情况",当时只简单用到dba_data_file"总大小"与dba_free_space"剩余大小"来判断空间使用情况 
  但当如下2种情况产生的时候 ,以前的脚本不太适用 ;
   1 DBF设置AUTOEXTENSIBLE='YES'自增长时, 例如:初步分配10G,使用9.9G,原方法使用率 = 9.9/ 10 *100 = 99%,而实际为=9.9 /( 'smailfile' ≈32 G )*100 = 31%;
   2 UNDO表空间循环使用,当大部分空间分配状态为UNEXPIRED,EXPIRED时,按照之前方式所算的使用率完全没有参考价值
 
     针对如上的2中情况 ,在如下sql已做改进.

SQL :

SELECT TBSP.TABLESPACE_NAME ,
       TBSP.TOTAL_GB ,
       TBSP.USE_GB ,
       TBSP.TOTAL_GB - TBSP.USE_GB FREE_GB,
       ROUND (TBSP.USE_GB TBSP.TOTAL_GB * 100 ,2 "USE%"
  FROM ( SELECT TOTAL.TABLESPACE_NAME ,
               TOTAL_GB ,
               /*USE.TABLESPACE_NAME IS NULL 表示表空间使用为0'未分配段'*/
               ( CASE WHEN USE.TABLESPACE_NAME IS NULL THEN 0
               /*各UNDO表空间ACTIVE状态USE_GB
               --ACTIVE表示目前仍活跃的事务相关回滚信息;
               --UNEXPIRED表示虽然事务已经结束但回滚信息保留的时间仍未超过实例参数 UNDO_RETENTION所设定的值;
               --EXPIRED表示回滚信息保留时间已超过UNDO_RETENTION所设定的值*/
               WHEN TOTAL.TABLESPACE_NAME IN ( SELECT DISTINCT TABLESPACE_NAME FROM DBA_UNDO_EXTENTSTHEN
               ( SELECT ROUND(NVL(SUM(BLOCKS) * 8 / 1024 / 1024,0), 2) AS "SIZE G" FROM DBA_UNDO_EXTENTS WHERE STATUS 'ACTIVE'
               AND TABLESPACE_NAME = TOTAL.TABLESPACE_NAMEELSE USE_GB END ) USE_GB  
          FROM (/*表空间总大小*/
                SELECT TABLESPACE_NAME ,
                       /*自动增长,OS层空间足够时,取MAXBYTES*/
                       ROUND (SUM (( CASE WHEN AUTOEXTENSIBLE 'YES' THEN MAXBYTES ELSE BYTES END ) / 1024 1024 / 1024 ), 2 TOTAL_GB
                  FROM DBA_DATA_FILES  
                 GROUP BY TABLESPACE_NAMETOTAL
          LEFT JOIN ( /*表空间真实使用情况*/
                    SELECT TABLESPACE_NAME ,
                           ROUND (SUM ( BYTES / 1024 / 1024 1024), 2 ) USE_GB
                      FROM DBA_SEGMENTS
                     GROUP BY TABLESPACE_NAMEUSE
            ON USE.TABLESPACE_NAME TOTAL.TABLESPACE_NAMETBSP
UNION ALL ( /*临时表空间使用情况*/
          SELECT TABLESPACE_NAME ,
                  ROUND (TF.TABLESPACE_SIZE 1024 / 1024 / 1024 2TABLESPACE_NAME ,
                  ROUND ((TF.TABLESPACE_SIZE TF.FREE_SPACE) / 1024 / 1024 1024 , 2 ) USE_GB ,
                  ROUND (TF.FREE_SPACE 1024 / 1024 / 1024 2FREE_GB ,
                  ROUND ((TF.TABLESPACE_SIZE TF.FREE_SPACE) /TF.TABLESPACE_SIZE * 100 , 2"USE%"
             FROM DBA_TEMP_FREE_SPACE TF);


视图官方介绍 


提示:
 若想针对各个DBF使用率进行查询,需要完善例如DBA_SEGMENTS.HEADER_FILE = DBA_DATA_FILES.FILE_ID...等


  【源于本人笔记】 若有书写错误,表达错误,请指正...


此条目发表在   SQL、SQL优化篇  分类目录。将固定连接加入收藏夹。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28602568/viewspace-1770577/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
擅长SQL编写及SQL优化,分析瓶颈,性能调优、故障处理,根据实际情况定制备份策略; 擅长编写脚本来实现自动化功能,600+SQL优化经验案例,为人热爱学习,喜欢钻研技术,对工作认真负责。

注册时间:2013-03-13

  • 博文量
    121
  • 访问量
    2295453