zoukankan      html  css  js  c++  java
  • [转] 使用SQL脚本查看表空间使用率和使用dba_tablespace_usage_metrics视图的差别

    传统的SQL脚本查看表空间使用率,使用的关键视DBA_DATA_FILEDBA_FREE_SPACE

    Oracle 11g引入了DBA_TABLESPACE_USAGE_METRICS图。其实,Oracle 10g中就已经引入了该视图。能够使用。但在10g官方文档中查不到,11g官方文档对该视图作了说明。

     

     

    Oracle 11g 官方文档中对DBA_TABLESPACE_USAGE_METRICS视图的说明:

     

    DBA_TABLESPACE_USAGE_METRICS describes tablespace 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,in database blocks

    TABLESPACE_SIZE

    NUMBER

     

    Total size of the tablespace,in database blocks

    USED_PERCENT

    NUMBER

     

    Percentage of used space,as a function of the maximum possible tablespace size

     

    从官网的说明来看。通过视图DBA_TABLESPACE_USAGE_METRICS能够非常方便的查看各类型表空间的使用情况,包含永久、暂时和undo表空间。

    可是,通过这个视图查询到的结果,和传统的SQL脚步查询到的结果不一致。并且相差非常大。

     

     

     

    看一下DBA_TABLESPACE_USAGE_METRICS视图的定义语句:

    select text from dba_views where view_name='DBA_TABLESPACE_USAGE_METRICS';

     

    TEXT

    -----------------------------------------------------------------

    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

         bitand(t.flags, 16) <> 16 and

         t.ts# = f.tablespace_id

         GROUP BY t.name, f.tablespace_id

    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

    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

    -----------------------------------------------------------------

     

    能够看出,DBA_TABLESPACE_USAGE_METRICS查询到的重要数据出自v$filespace_usage视图。

     

     

    v$filespace_usage图,11g官方文档的说明例如以下:

     

    V$FILESPACE_USAGE summarizes space allocation information of each datafile and tempfile.

    Column

    Datatype

    Description

    TABLESPACE_ID

    nubmer

    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

     

     

     

    依据以上分析,能够得出下面结论:

    1DBA_TABLESPACE_USED_SPACE是已经分配的空间,相应V$FILESPACE_USAGEALLOCATED_SPACE字段。

    2DBA_TABLESPACE_USAGE_METRICSTABLESPACE_SIZE相应V$FILESPACE_USAGEFILE_MAXSIZE字段(而不是FILE_SIZE)。

    注意:这里相应的是最大值。假设数据文件是自己主动增长的。那么,对于8kblock,这里的最大值就是32G,也就是通过DBA_TABLESPACE_USAGE_METRICS视图查询显示的4194302blocks

     

    SQL> select * from dba_tablespace_usage_metrics;

     

    TABLESPACE_NAME     USED_SPACE     TABLESPACE_SIZE      USED_PERCENT

    ------------------------------ ---------- --------------- -------

    SYSAUX                       16576         4194302          .395202825

    SYSTEM                       33912         4194302          .808525471

    TEMP                              0         4194302                     0

    UNDOTBS1                       288         4194302          .006866458

    USERS                            24         4194302          .000572205

     

     

    而以下是用SQL脚本查询到的表空间使用率情况,出入非常大:

    TABLESPACE_NAME SUM_SPACE SUM_BLOCKS USED_SPACE USED_RATE FREE_SPACE

    ---------- ---------- ---------- ---------- ---------- ----------

    SYSAUX       140M            17920   129.56M     92.54%     10.44M

    SYSTEM       300M            38400   265M         88.33%     35M

    TEMP         20M              2560    16M          80%        4M

    UNDOTBS1     200M            25600   19.31M      9.66%      180.69M

    USERS        5M                640    .19M         3.8%       4.81M

     

     

     

     

     

    以下測试对于自己主动扩展和非自己主动扩展的表空间。两种方法的查询结果:

    1、创建表空间

    TS1:自己主动扩展。

    TS2:非自己主动扩展。

     

    SQL> create tablespace TS1 datafile 'E:oracleproduct10.2.0oradataORCLDATAFILE s01.dbf' size 100M autoextend on next 10M maxsize 1G;

     

    表空间已创建。

     

    SQL> create tablespace TS2 datafile 'E:oracleproduct10.2.0oradataORCLDATAFILE s02.dbf' size 100M autoextend off;

     

    表空间已创建。

     

    2、分别使用两种方法查看表空间情况

    1)、使用DBA_TABLESPACE_USAGE_METRICS视图

    SQL> select * from dba_tablespace_usage_metrics where tablespace_name in ('TS1','TS2');

     

    TABLESPACE_NAME     USED_SPACE     TABLESPACE_SIZE      USED_PERCENT

    ------------------------------ ---------- --------------- -------

    TS1                               0               131072            0

    TS2                               0                12800            0

     

    2)、使用SQL脚本查看

    TABLESPACE_NAME SUM_SPACE SUM_BLOCKS USED_SPACE USED_RATE FREE_SPACE

    --------------- ---------- ---------- ---------- ----------

    TS1             100M            12800 .06M       .06%       99.94M

    TS2             100M            12800 .06M       .06%       99.94M

     

     

    3、分别在两个表空间创建一样的表,插入数据

    SQL> create table tt1 tablespace ts1 as select * from dba_objects;

     

    表已创建。

     

    SQL> insert into tt1 select * from dba_objects;

     

    已创建11334行。

     

    SQL> insert into tt1 select * from dba_objects;

     

    已创建11334行。

     

    SQL> insert into tt1 select * from dba_objects;

     

    已创建11334行。

     

    SQL> insert into tt1 select * from dba_objects;

     

    已创建11334行。

     

    SQL> insert into tt1 select * from dba_objects;

     

    已创建11334行。

     

    SQL> commit;

     

    提交完毕。

     

     

    SQL> create table tt2 tablespace ts2 as select * from dba_objects;

     

    表已创建。

     

    SQL> insert into tt2 select * from dba_objects;

     

    已创建11335行。

     

    SQL> insert into tt2 select * from dba_objects;

     

    已创建11335行。

     

    SQL> insert into tt2 select * from dba_objects;

     

    已创建11335行。

     

    SQL> insert into tt2 select * from dba_objects;

     

    已创建11335行。

     

    SQL> insert into tt2 select * from dba_objects;

     

    已创建11335行。

     

    SQL> commit;

     

    提交完毕。

     

     

    4、再用两种方法查看表空间使用情况

    SQL> select * from dba_tablespace_usage_metrics where tablespace_name in ('TS1','TS2');

     

    TABLESPACE_NAME USED_SPACE TABLESPACE_SIZE USED_PERCENT

    --------------- ---------- --------------- ------------

    TS1                    896          131072    .68359375

    TS2                    896           12800            7

     

    通过对照,表空间TS1TS2实际使用的空间是一致的,都是896block。但对于能够扩展的表空间TS1,这里表空间的最大值为131072block,即指定的能够扩展到的1G。由此,计算出的使用率也就出现了偏差。

    因此,对于自己主动扩展的表空间。DBA_TABLESPACE_USAGE_METRICS视图就不那么适用了。

     

     

     

     

     

    使用脚本:

    TABLESPACE_NAME SUM_SPACE SUM_BLOCKS USED_SPACE USED_RATE FREE_SPACE

    --------------- ---------- ---------- ---------- ----------

    TS1             100M            12800 7.06M      7.06%      92.94M

    TS2             100M            12800 7.06M      7.06%      92.94M

     

    能够看出。通过脚本查询出的结果。两个表空间的使用率是一致的。

     

     

     

    总结:

    对于非自己主动扩展的表空间,使用DBA_TABLESPACE_USAGE_METRICS视图,与传统脚本使用的DBA_DATA_FILEDBA_FREE_SPACE查询的结果是一致的。

    对于自己主动扩展的表空间,DBA_TABLESPACE_USAGE_METRICS视图查询的结果就不准确了,还要使用传统的方法查询。



    转自:http://blog.itpub.net/25744374/viewspace-774253

  • 相关阅读:
    电话号码和手机号码正则
    IntelliJ Idea 常用快捷键
    springboot常用注解
    idea常用快捷键和插件
    百度地图API的使用方法
    js 经常用到的键盘码
    https://www.cnblogs.com/
    axios传参 后台接收为空
    面相对象之继承
    初始面向对象
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5245708.html
Copyright © 2011-2022 走看看