以前写了一篇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. jQuery-1.9.1源码分析系列(二)jQuery选择器

    1.选择器结构 jQuery的选择器根据源码可以分为几块 init: function( selector, context, rootjQuery ) { ... // HANDLE: $(&quo ...

  2. HTTP首部

    前面有几篇博文介绍了HTTP协议.HTTP请求方法详解.Javascript中Cookie的那些事儿.HTTPS,今天我们来聊一聊关于HTTP首部的那些事儿 HTTP协议的请求和响应报文中肯定包含HT ...

  3. caching与缓存

    通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用 ...

  4. authorization与URL授权

    利用Web.config中的authorization标签设置授权属于URL授权. 使用 URL 授权 通过 URL 授权,您可以显式允许或拒绝某个用户名或角色对特定目录的访问权限.为此,请在该目录的 ...

  5. Concurrency in csharp (Asynchronous, Parallel, and Multithreaded Programming)

    http://stephencleary.com/projects/ /// <summary> /// /// </summary> public partial class ...

  6. linux命令大全之ln命令详解(创建软链接和硬链接)

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接,分为软链接.硬链接.软链接相当于windows的快捷方式,下面是使用方法和示例   ln是linux中又一 ...

  7. Lind.DDD.Domain.IOwnerBehavor对实体的意义

    回到目录 对于Lind.DDD架构,我之前写了不少文章,对于它的Domain模式也介绍了不少,像之前的IEntity,ILogicDeleteBehavor,IModifyBehavor,IStatu ...

  8. java中 try return finally return

    finally块里面的代码一般都是会执行的,除非执行 System.exit(int),停止虚拟机,断电. 1.若try代码块里面有return ,假设要return 的值 是A,A为基本类型或者被f ...

  9. linux下tomcat安全配置

    转:http://www.tuicool.com/articles/R7fQNfQ 0x00 删除默认目录 安装完tomcat后,删除 $CATALINA_HOME/webapps 下默认的所有目录文 ...

  10. 获取SqlServer存储过程定义的3种方法

    第一种: declare @p_text varchar(max) SELECT @p_text= text FROM syscomments WHERE id = ( SELECT id FROM ...