一.DBA_TABLESPACE_USAGE_METRICS 视图的理论说明
 
群里一朋友说使用dba_tablespace_usage_metrics 视图查看表空间的结果不正确,如下:
 
 
 
dba_tablespace_usage_metrics视图在oracle 10g中引入,但未公开。 到了Oracle11g公开了这个视图。因为在Oracle 10g里可以使用这个视图,但是在官网文档里看不到说明,但是在11g的官方文档里可以查看到该视图的说明。
 
Oracle 11g中对这个视图的说明如下:
 
DBA_TABLESPACE_USAGE_METRICS describestablespace usage metrics for all types of tablespaces, including permanent,temporary, and undo tablespaces.
Column
Datatype
NULL
Description
TABLESPACE_NAME
VARCHAR2(30)
 
Tablespace name
USED_SPACE
NUMBER
 
Total space consumed by the tablespace(blocks)
TABLESPACE_SIZE
NUMBER
 
Total size of the tablespace(blocks)
USED_PERCENT
NUMBER
 
Percentage of used space, as a function of the maximum possible tablespace size(USED_SPACE / TABLESPACE_SIZE * 100)
 
从官网的说明,这个视图很方便,通过DBA_TABLESPACE_USAGE_METRICS视图就可以查看所有类型表空间的使用情况,包括永久,临时和undo 表空间。
       Oracle的文档也说的不够详细。上面表格中的括号部分Dave的补充。 DBA_TABLESPACE_USAGE_METRICS
视图中的USED_SPACE和TABLESPACE_SIZE的单位是block。默认情况下,oracle的每个block 是8k。
 
我们先查看DBA_TABLESPACE_USAGE_METRICS视图的创建代码:
 
SQL> select * from v$version;
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE   11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 -Production
NLSRTL Version 11.2.0.3.0 – Production
 
SQL> set pagesize 500
SQL> set long 999999
SQL> select text from dba_views where view_name='DBA_TABLESPACE_USAGE_METRICS';
 
TEXT
--------------------------------------------------------------------------------
SELECT t.name,
       tstat.kttetsused,
       tstat.kttetsmsize,
       (tstat.kttetsused / tstat.kttetsmsize) * 100
 FROM  sys.ts$ t, x$kttets tstat
 WHERE
       t.online$ != 3 and
       t.bitmapped <> 0 and
       t.contents$ = 0 and
       bitand(t.flags, 16) <> 16 and
       t.ts# = tstat.kttetstsn
union
 SELECT t.name, sum(f.allocated_space),sum(f.file_maxsize),
    (sum(f.allocated_space)/sum(f.file_maxsize))*100
    FROM sys.ts$ t, v$filespace_usage f
    WHERE
    t.online$ != 3 and
    t.bitmapped <> 0 and
    t.contents$ <> 0 and
    f.flag = 6 and
    t.ts# = f.tablespace_id
    GROUP BY t.name, f.tablespace_id, t.ts#
union
 SELECT t.name, sum(f.allocated_space),sum(f.file_maxsize),
    (sum(f.allocated_space)/sum(f.file_maxsize))*100
    FROM sys.ts$ t, gv$filespace_usage f, gv$parameter param
    WHERE
    t.online$ != 3 and
    t.bitmapped <> 0 and
    f.inst_id = param.inst_id and
    param.name = 'undo_tablespace' and
    t.name = param.value and
    f.flag = 6 and
    t.ts# = f.tablespace_id
    GROUP BY t.name, f.tablespace_id, t.ts#
 
 
SQL>
 
通过上面的代码,我们可以看到,DBA_TABLESPACE_USAGE_METRICS说能查询所有类型的表空间,其本质也是进行了3个union。其关键数据还是出自:v$filespace_usage 视图。
 
官网对v$filespace_usage 视图的说明如下:
 
V$FILESPACE_USAGE summarizes spaceallocation information of each datafile and tempfile.
Column
Datatype
Description
TABLESPACE_ID
NUMBER
ID of the tablespace to which the file belongs
RFNO
NUMBER
Relative file number of the file
ALLOCATED_SPACE
NUMBER
Total allocated space in the file
FILE_SIZE
NUMBER
Current file size
FILE_MAXSIZE
NUMBER
Maximum file size
CHANGESCN_BASE
NUMBER
SCN base of the last change to the file
CHANGESCN_WRAP
NUMBER
SCN wrap of the last change to the file
FLAG
NUMBER
Flags for file attributes
 
根据以上的分析,我们可以得出一个结论:
1.  DBA_TABLESPACE_USAGE_METRICS的USED_SPACE是已经分配的空间,对应V$FILESPACE_USAGE的ALLOCATED_SPACE的字段。
2.  DBA_TABLESPACE_USAGE_METRICS的TABLESPACE_SIZE对应V$FILESPACE_USAGE的FILE_MAXSIZE字段。 这里对应的是最大值,如果我们的数据文件是自增长的,那么对于8k的block,那么这里的最大值就是32G。也就是最开始显示的4194302个blocks。
 
这个值与我们使用传统的DBA_DATA_FILES和DBA_FREE_SPACE查询的结果就会有很大的出入。
 
/* Formatted on 2013/3/21 20:39:40(QP5 v5.185.11230.41888) */
  SELECTD.TABLESPACE_NAME,
         SPACE"SUM_SPACE(M)",
         BLOCKSSUM_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(  SELECTTABLESPACE_NAME,
                  ROUND (SUM(BYTES)/(1024 * 1024),2) SPACE,
                  SUM (BLOCKS)BLOCKS
             FROM DBA_DATA_FILES
          GROUPBYTABLESPACE_NAME) D,
         (  SELECTTABLESPACE_NAME,
                  ROUND (SUM(BYTES)/(1024 * 1024),2) FREE_SPACE
             FROM DBA_FREE_SPACE
          GROUPBYTABLESPACE_NAME) F
   WHERED.TABLESPACE_NAME =F.TABLESPACE_NAME(+)
ORDER BY"USED_RATE(%)"DESC;
 
二.测试
 
我们这里创建2个表空间永久的表空间:
1)  TS1: 自增长
2)  TS2:不增长
 
然后分别使用使用上面说的2种方法查询表空间的使用情况。
 
2.1 创建表空间
 
SQL> create tablespace TS1 datafile'/u01/app/oracle/oradata/dave/ts01.dbf' size 100M autoextend on next 10Mmaxsize 1G;
Tablespace created.
 
SQL> create tablespace TS2 datafile'/u01/app/oracle/oradata/dave/ts02.dbf' size 100M autoextend off;
Tablespace created.
 
2.2 使用2种方法查看表空间情况
 
SQL> col tablespace_name for a15
SQL> select * from DBA_TABLESPACE_USAGE_METRICSwhere tablespace_name in ('TS1','TS2');
 
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZEUSED_PERCENT
--------------- ---------- ---------------------------
TS1                    128          131072    .09765625
TS2                    128           12800            1
 
 
SQL>  SELECT D.TABLESPACE_NAME,
 2           SPACE"SUM_SPACE(M)",
 3           BLOCKS SUM_BLOCKS,
 4           SPACE - NVL(FREE_SPACE, 0) "USED_SPACE(M)",
 5           ROUND ( (1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",
 6           FREE_SPACE"FREE_SPACE(M)"
 7      FROM (  SELECT TABLESPACE_NAME,
 8                     ROUND (SUM(BYTES) / (1024 * 1024), 2) SPACE,
 9                     SUM (BLOCKS) BLOCKS
 10                FROM DBA_DATA_FILES
 11           GROUP BY TABLESPACE_NAME) D,
 12          (  SELECT TABLESPACE_NAME,
 13                     ROUND (SUM (BYTES) / (1024* 1024), 2) FREE_SPACE
 14                FROM DBA_FREE_SPACE
 15           GROUP BY TABLESPACE_NAME) F
 16    WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) AND D.TABLESPACE_NAME in('TS1','TS2');
 
TABLESPACE_NAME SUM_SPACE(M) SUM_BLOCKSUSED_SPACE(M) USED_RATE(%) FREE_SPACE(M)
--------------- ------------ ----------------------- ------------ -------------
TS2                      100      12800             1            1            99
TS1                      100      12800             1            1            99
 
 
2.3 分别在2个表空间创建一样的表
 
SQL> create table D1 tablespace TS1 asselect * from dba_objects;
Table created.
 
SQL> insert into D1 select * fromdba_objects;
75489 rows created.
 
SQL> insert into D1 select * fromdba_objects;
75489 rows created.
 
SQL> insert into D1 select * fromdba_objects;
75489 rows created.
 
SQL> insert into D1 select * fromdba_objects;
75489 rows created.
 
SQL> commit;
Commit complete.
 
 
SQL> create table D2 tablespace TS2 asselect * from dba_objects;
Table created.
 
SQL> insert into D2 select * fromdba_objects;
75490 rows created.
 
SQL> insert into D2 select * fromdba_objects;
75490 rows created.
 
SQL> insert into D2 select * fromdba_objects;
75490 rows created.
 
SQL> insert into D2 select * fromdba_objects;
75490 rows created.
 
SQL> commit;
Commit complete.
 
 
2.4 再次查看表空间变化
 
SQL> select * from DBA_TABLESPACE_USAGE_METRICS where tablespace_name in('TS1','TS2');
 
TABLESPACE_NAME USED_SPACE TABLESPACE_SIZEUSED_PERCENT
--------------- ---------- ---------------------------
TS1                   5632          131072     4.296875
TS2                   5632           12800           44
 
注意:
我们TS1是最大表空间是131072。 因为我们创建TS1表空间时指定的大小是1G。所以我们计算一下:131072*8K/1024= 1024M =1G。这样就正好和我们第一节的理论知识保持一致。
通过对比我们也可以确定,我们TS1表空间实际使用的空间和TS2表空间一致,都是5632个block。但是在计算使用率的时候,就出现了偏差。所以对于自动增长的表空间,DBA_TABLESPACE_USAGE_METRICS 视图就不那么适用了。
 
 
SQL>  SELECT D.TABLESPACE_NAME,
 2           SPACE"SUM_SPACE(M)",
 3           BLOCKS SUM_BLOCKS,
 4           SPACE - NVL(FREE_SPACE, 0) "USED_SPACE(M)",
 5           ROUND ( (1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",
 6           FREE_SPACE"FREE_SPACE(M)"
 7      FROM (  SELECT TABLESPACE_NAME,
 8                     ROUND (SUM(BYTES) / (1024 * 1024), 2) SPACE,
 9                     SUM (BLOCKS) BLOCKS
 10                FROM DBA_DATA_FILES
 11           GROUP BY TABLESPACE_NAME) D,
 12          (  SELECT TABLESPACE_NAME,
 13                     ROUND (SUM (BYTES) / (1024* 1024), 2) FREE_SPACE
 14                FROM DBA_FREE_SPACE
 15           GROUP BY TABLESPACE_NAME) F
 16    WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) AND D.TABLESPACE_NAME in('TS1','TS2');
 
TABLESPACE_NAME SUM_SPACE(M) SUM_BLOCKSUSED_SPACE(M) USED_RATE(%) FREE_SPACE(M)
--------------- ------------ ----------------------- ------------ -------------
TS2                      100      12800            44           44            56
TS1                      100      12800            44           44            56
 
但我们通过DBA_DATA_FILES和DBA_FREE_SPACE查询结果就是一致的。
 
 
三.小结
 
通过上面的对比,dba_tablespace_usage_metrics视图对于非自动增长的表空间,和我们使用传统的DBA_DATA_FILES和DBA_FREE_SPACE查询的结果是一致的。
 
但是对于自动增长的表空间,dba_tablespace_usage_metrics的表空间就不准确了。还是要使用原始的方法来查询。

Oracle dba_tablespace_usage_metrics 视图 查看表空间 说明的更多相关文章

  1. Oracle 数据库中查看表空间的2种方法

    在Oracle数据库中查看表空间使用状况是我们在实际应用中经常涉及到的,以下的内容就就是对Oracle 数据库中查看表空间使用状况时所要用到的SQL的描述,希望你能从中获得自己想要的东西. Oracl ...

  2. [转] 使用SQL脚本查看表空间使用率和使用dba_tablespace_usage_metrics视图的差别

    传统的SQL脚本查看表空间使用率,使用的关键视DBA_DATA_FILE和DBA_FREE_SPACE. Oracle 11g引入了DBA_TABLESPACE_USAGE_METRICS视图.其实, ...

  3. Oracle 查看表空间大小及其扩展

    在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成.系统中默认创建的几个表空间:S ...

  4. 【总结】Oracle数据库 查看表空间和增加表空间

    一.Oracle查看 表空间 的名称及其大小 查看 表空间的名称及其大小的SQL语句: select t1.tablespace_name,round(sum(bytes/(1024*1024)),0 ...

  5. Oracle以及SDE维护常用命令-查看表空间等

    之前现场反馈一个数据更新的问题,查看感觉是因为表空间满了导致的(错误在之前的博客随笔中写过),因此远程对服务器进行查看.个人平常都是通过Oracle客户端的Entreprise Manager Con ...

  6. ORACLE查看表空间对象

    ORACLE如何查看表空间存储了那些数据库对象呢?可以使用下面脚本简单的查询表空间存储了那些对象: SELECT TABLESPACE_NAME       AS TABLESPACE_NAME    ...

  7. Oracle 查看表空间的大小及使用情况sql语句

    --1.查看表空间的名称及大小 )), ) ts_size FROM dba_tablespaces t, dba_data_files d WHERE t.tablespace_name = d.t ...

  8. Oracle查看表空间及修改数据文件大小

    Oracle查看表空间及修改数据文件大小 第一步:查看所有表空间及表空间大小: select tablespace_name ,sum(bytes) / 1024 / 1024 as MB from ...

  9. Oracle查看表空间,创建表空间

    查看表空间: SELECT tablespace_name, file_id, file_name, round(bytes / (1024 * 1024), 0) total_space FROM ...

随机推荐

  1. C# 校验帮助类-正则表达式

    一.简介 很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的.所以我把自己整理的校验帮助类分享处理,在这里分享一下,给自己留 ...

  2. 关于mysql查询数据库时间和系统时间差

    1. MySQL数据库表中有两个时间的字段,需要计算他们的时间差: (1)datediff函数来表示时间差. 基本语法: DATEDIFF(datepart,startdate,enddate) 说明 ...

  3. Vue.js入学教程

    Vue.js是什么Vue.js 是用于构建交互式的 Web 界面的库.Vue.js 提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单.灵活的 API.Vue.js(类似于view)是一套构建 ...

  4. 使用freemarker模板生成word文档

    项目中最近用到这个东西,做下记录. 如下图,先准备好一个(office2003)word文档当做模板.文档中图片.姓名.性别和生日已经使用占位符代替,生成过程中将会根据实际情况进行替换. 然后将wor ...

  5. 使用Webpack加速Vue.js应用的4种方式

    Webpack是开发Vue.js单页应用程序的重要工具. 通过管理复杂的构建步骤,你可以更轻松地开发工作流程,并优化应用程序的大小和性能. 其中介绍下面四种方式: 单个文件组件 优化Vue构建 浏览器 ...

  6. 关于JAVA正则匹配空白字符的问题

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下    \s    不支持全角 1.& ...

  7. threejs里面的vector3源码解析

    // File:src/math/Vector3.js /** * @author mrdoob / http://mrdoob.com/ * @author *kile / http://kile. ...

  8. Andorid源码系列:View的onTouchEvent()与performClick(),performLongClick()调用时机解析

    这是大土豆的第一篇博客,想着工作3年多了,在工作上从一名菜鸟逐渐成长为在项目中能干点事的人,自己对Android的见解也一步步加深,有必要写一些对Android代码和开发过程中的感悟,和广大朋友们分享 ...

  9. PowerShell 远程执行任务

    在 linux 中我们可以使用 SSH 执行各种远程操作,同样的在 windows 平台上我们可以通过 PowerShell 获得类似的能力.本文将介绍通过 PowerShell 执行远程操作的基本信 ...

  10. Spring mybatis源码篇章-sql mapper配置文件绑定mapper class类

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-MybatisDAO文件解析(二) 背景知识 MappedStatement是mybatis操作sql ...