以前写了一篇ORACLE临时表空间总结的文章, 里面介绍了几个查看临时表空间使用情况的脚本,其中一个脚本如下所示:

SELECT TU.TABLESPACE_NAME                                    AS "TABLESPACE_NAME",

       TT.TOTAL - TU.USED                                    AS "FREE(G)",

       TT.TOTAL                                              AS "TOTAL(G)",

       ROUND(NVL(TU.USED, 0) / TT.TOTAL * 100, 3)            AS "USED(%)",

       ROUND(NVL(TT.TOTAL - TU.USED, 0) * 100 / TT.TOTAL, 3) AS "FREE(%)"

FROM (SELECT TABLESPACE_NAME, 

              SUM(BYTES_USED) / 1024 / 1024 / 1024 USED

       FROM GV_$TEMP_SPACE_HEADER

       GROUP BY TABLESPACE_NAME) TU ,

     (SELECT TABLESPACE_NAME,

              SUM(BYTES) / 1024 / 1024 / 1024 AS TOTAL

       FROM DBA_TEMP_FILES

       GROUP BY TABLESPACE_NAME) TT

WHERE TU.TABLESPACE_NAME = TT.TABLESPACE_NAME;

其实这个查看表空间的脚本是不准确的,有问题的(当然前面博客里面所提到的脚本到现在也没有改,以后也不打算修改了,就这样放着吧)。你可以对比下面几个脚本来看看。

如果临时表空间是dictionary managed temporary tablespace,可以使用下面SQL:

SELECT (S.TOT_USED_BLOCKS/F.TOTAL_BLOCKS)*100 AS "PERCENT USED"

FROM

  (SELECT SUM(USED_BLOCKS) TOT_USED_BLOCKS

  FROM V$SORT_SEGMENT

  WHERE TABLESPACE_NAME='TEMPSCM2'

  ) S,

  (SELECT SUM(BLOCKS) TOTAL_BLOCKS

  FROM DBA_DATA_FILES

  WHERE TABLESPACE_NAME='TEMPSCM2'

  ) F;

如果临时表空间是Locally Manageed Temporary Tablespace,使用下面SQL:

SQL> SELECT  T.TABLESPACE_NAME,

            ( U.TOT_USED_BLOCKS / T.TOTAL_BLOCKS ) * 100 AS "PERCENT USED" 

     FROM   (SELECT TABLESPACE_NAME,

                    SUM(USED_BLOCKS) TOT_USED_BLOCKS 

             FROM   V$SORT_SEGMENT 

             WHERE  TABLESPACE_NAME = &TABLESPACE_NAME

             GROUP BY TABLESPACE_NAME) U, 

            (SELECT TABLESPACE_NAME,

                    SUM(BLOCKS) TOTAL_BLOCKS 

             FROM   DBA_TEMP_FILES 

             WHERE  TABLESPACE_NAME = &TABLESPACE_NAME

             GROUP BY TABLESPACE_NAME) T;

当然你也可以使用下面SQL来查看临时表空间的使用情况, 如下所示:

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(%)", 

               SPACE - used_space                         "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, 

                       Round(SUM(blocks * 8192) / ( 1024 * 1024 ), 2) USED_SPACE 

                FROM   v$sort_usage 

                GROUP  BY tablespace) F 

        WHERE  D.tablespace_name = F.tablespace(+)

          AND  D.tablespace_name='TEMPSCM2'

那么为什么GV_$TEMP_SPACE_HEADER统计的数据不准确呢? 这个是因为GV_$TEMP_SPACE_HEADER取数据不准确,官方解释为:

The views v$sort_usage or v$tempseg_usage ( and v$sort_segment) give the correct information regarding the allocation of sort segments.

We should always query these views to find out the actual temp usage. The view v$temp_space_header shows that these many blocks were touched in each temp file at some point when temp usage was at its highest,

in essence, it shows the number of initialized blocks for each tempfile, not the actual allocated blocks.

The views v$sort_usage/v$tempseg_usage show the actual sort extents allocated for each transaction from these initialized blocks. Also, v$temp_space_header is persistent across restarts. V$sort_segment and v$sort_usage are not.

第二段我翻译如下:

视图v$temp_space_header显示的是每一个temp文件在某一个时刻使用过的最大大小,从本质上说,它显示的是每一个tempfile的初始化大小,而不是实际分配的块大小。

所以说从视图v$temp_space_header获取的数据其实并不是实际使用的大小,它是不准确的。那么肯定有人会问,脚本里面不是访问的GV_$TEMP_SPACE_HEADER视图吗? 跟这个视图v$temp_space_header有关系吗? 答案是有关系,他们的数据来源是一致的,也就是说来自相同的内部表,如下所示:

一般来说,在GV$和V$之后, Oracle会建立GV_$和V_$视图, 随后为这些视图建立了公用同义词。GV_$TEMP_SPACE_HEADER是一个视图,如下所示

SQL> SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_NAME ='GV_$TEMP_SPACE_HEADER';

 

OWNER                   OBJECT_NAME                         OBJECT_TYPE

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

SYS                     GV_$TEMP_SPACE_HEADER                VIEW

GV_$TEMP_SPACE_HEADER视图的定义如下所示:

SELECT DBMS_METADATA.GET_DDL('VIEW', 'GV_$TEMP_SPACE_HEADER', 'SYS') FROM DUAL;

SELECT * FROM DBA_VIEWS WHERE VIEW_NAME='GV_$TEMP_SPACE_HEADER';

 

 

SELECT "INST_ID",

 "TABLESPACE_NAME",

 "FILE_ID",

 "BYTES_USED",

 "BLOCKS_USED",

 "BYTES_FREE",

 "BLOCKS_FREE",

 "RELATIVE_FNO"

ROM gv$temp_space_header

而gv$temp_space_header视图的定义如下(当然如果查询DBA_OBJECTS会发现它是一个同义词,指向GV_$TEMP_SPACE_HEADER,这个后面介绍原因)

SQL>  select view_definition from v$fixed_view_definition

  2  where view_name='GV$TEMP_SPACE_HEADER';

 

VIEW_DEFINITION

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

select /*+ ordered use_nl(hc) */ hc.inst_id, ts.name, hc.ktfthctfno, (hc.ktfthcs

z - hc.ktfthcfree)*ts.blocksize, (hc.ktfthcsz - hc.ktfthcfree), hc.ktfthcfree*ts

.blocksize, hc.ktfthcfree, hc.ktfthcfno from ts$ ts, x$ktfthc hc where ts.conten

ts$ = 1 and ts.bitmapped <> 0 and ts.online$ = 1 and ts.ts# = hc.ktfthctsn and h

c.ktfthccval = 0

 

 

SQL> 

v$temp_space_header它也是一个视图(查询DBA_OBJECTS发现其是一个同义词,这个后面介绍),你会发现v$temp_space_header其实是从视图GV$TEMP_SPACE_HEADER过滤数据,如下所示:

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM DBA_OBJECTS WHERE OBJECT_NAME =upper('v$temp_space_header');

 

 

QL> select view_definition from v$fixed_view_definition

 2   where view_name=upper('v$temp_space_header');

 

IEW_DEFINITION

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

elect  TABLESPACE_NAME , FILE_ID , BYTES_USED , BLOCKS_USED , BYTES_FREE , BLOC

S_FREE , RELATIVE_FNO from GV$TEMP_SPACE_HEADER where inst_id = USERENV('Instan

e')

你在$ORACLE_HOME/rdbms/admin下的catspace.sql中,就会发现这样的SQL,这就解释了为什么gv$temp_space_header是视图,又是同义词的原因。

create or replace view gv_$temp_space_header as select * from gv$temp_space_header;

 

create or replace public synonym gv$temp_space_header

   for gv_$temp_space_header;

 

grant select on gv_$temp_space_header to SELECT_CATALOG_ROLE;

ORACLE使用GV_$TEMP_SPACE_HEADER统计临时表空使用情况不准确的问题的更多相关文章

  1. Oracle 11gR2 用exp无法导出空表解决方法

    Oracle 11gR2 用exp无法导出空表解决方法 在11gR2中有个新特性,当表无数据时,不分配segment以节省空间.Oracle 当然在运行export导出时,空表则无法导出,可是还是有解 ...

  2. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  3. Oracle中的NULL、’’(空字符串)以及’_’(空格)

    本文首发于 http://youngzy.com/ 在Oracle中使用 null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? null和’’(空字符串)是一个意思 注: 为了便于 ...

  4. EXCEL小技巧:如何统计非空单元格

    http://club.excelhome.net/thread-1187271-1-1.html 下面教大家如果用函数统计非空单元格的数量 首先我们来介绍几个统计函数: 1.COUNT(value1 ...

  5. oracle order by 字段不能为空 为空速度慢 不走索引

    oracle order by 字段不能为空 为空速度慢 不走索引

  6. Excel 如何统计非空非零单元格的个数

    使用 Excel 统计非空非零单元格的个数: ——使用函数 :=COUNTIFS($B$2:$B$194440,"<>",$B$2:$B$194440,"&l ...

  7. [统计信息系列7] Oracle 11g的自动统计信息收集

    (一)统计信息收集概述 在Oracle 11g中,默认有3个自动任务,分别是:自动统计信息收集.SQL调优顾问.段空间调整顾问,查看方法如下: SQL> SELECT CLIENT_NAME,T ...

  8. Oracle 11gR2 待定的统计信息(Pending Statistic)

    Oracle 11gR2 待定的统计信息(Pending Statistic) 官档最权威: 发布优化器统计信息的用户界面 管理已发布和待处理的统计信息 实验先拖着.

  9. Linux,du、df统计的硬盘使用情况不一致问题

    [转]http://blog.linezing.com/?p=2136 Linux,du.df统计的硬盘使用情况不一致问题   在运维Linux服务器时,会碰到需要查看硬盘空间的情况,这时候,通常会使 ...

随机推荐

  1. M端总结

    最近在项目开发过程中涉及到了移动端,现在对此进行总结. 在此次M端的开发过程中,遇到了许多问题,在此进行一次总结,希望大家在以后的开发过程中能尽量规避类似的问题,提高开发效率和代码质量.一.布局1.移 ...

  2. 韩国"被申遗" (转自果壳)

    "被申遗"不是指"没申遗",而是全都经过了中国人重新包装. 近日,有报道称韩国计划将火炕申报世界遗产,联系近年来韩国多起"申遗事件",国内网 ...

  3. 使用 CSS3 实现超炫的 Loading(加载)动画效果

    SpinKit 是一套网页动画效果,包含8种基于 CSS3 实现的很炫的加载动画.借助 CSS3 Animation 的强大功能来创建平滑,易于定制的动画.SpinKit 的目标不是提供一个每个浏览器 ...

  4. SQL Server 通过重建方式还原 master 数据库

    1,备份master数据库 2,停止服务,直接删除master数据文件 3,用安装程序重建master数据文件 控制台下进入安装目录就不说了 D:\SetUp\sqlserver2012>Set ...

  5. VS 常用快捷键

    区域代码选择:按Shift选择整(行)块代码,可配合四个方向键(左右键:选择单个字符,上下键:上下行的当前列).Home(当前行首).End(当前行尾).PgUp(当前页首)和PgDn(当前页尾)使用 ...

  6. 如何汉化XAF应用

    这是一个入门级的问题,应网友请求,总结一下XAF汉化过程的几个关键点. 一.所有Dev的控件的汉化,Dev官方有汉化文件.点击下载15.2版本. 正版用户登陆至官网是有专门的下载界面的,并且可以参与汉 ...

  7. C++_系列自学课程_第_3_课_变量和基本类型_《C++ Primer 第四版》

    最近复习C++相关内容,决定在这里记录自己复习的过程. 以前写过部分文字,但是没有坚持连续写,因此学完后 基本又忘光啦,主要是没有实践,这一次决定自学完后,在这里在复习一遍增强自己的记忆和理解程度. ...

  8. JAVA基础,字符串

    字符串String(一个字符数组,常量,不可变): 1. 创建并初始化字符串: 1). 使用字符串常量直接初始化 String s="hello!"; 2). 使用构造方法创建并初 ...

  9. UDS(ISO14229-2006) 汉译(No.4 术语和缩写)

    A_PCI                    Application layer Protocol Control Information应用层协议控制消息. A_PDU              ...

  10. Linux命令详解之—tail命令

    tail命令也是一个非常常用的文件查看类的命令,今天就为大家介绍下Linux tail命令的用法. 更多Linux命令详情请看:Linux命令速查手册 Linux tail命令主要用来从指定点开始将文 ...