ORACLE使用GV_$TEMP_SPACE_HEADER统计临时表空使用情况不准确的问题
以前写了一篇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统计临时表空使用情况不准确的问题的更多相关文章
- Oracle 11gR2 用exp无法导出空表解决方法
Oracle 11gR2 用exp无法导出空表解决方法 在11gR2中有个新特性,当表无数据时,不分配segment以节省空间.Oracle 当然在运行export导出时,空表则无法导出,可是还是有解 ...
- Java调用oracle存储过程通过游标返回临时表数据
注:本文来源于 < Java调用oracle存储过程通过游标返回临时表数据 > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...
- Oracle中的NULL、’’(空字符串)以及’_’(空格)
本文首发于 http://youngzy.com/ 在Oracle中使用 null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? null和’’(空字符串)是一个意思 注: 为了便于 ...
- EXCEL小技巧:如何统计非空单元格
http://club.excelhome.net/thread-1187271-1-1.html 下面教大家如果用函数统计非空单元格的数量 首先我们来介绍几个统计函数: 1.COUNT(value1 ...
- oracle order by 字段不能为空 为空速度慢 不走索引
oracle order by 字段不能为空 为空速度慢 不走索引
- Excel 如何统计非空非零单元格的个数
使用 Excel 统计非空非零单元格的个数: ——使用函数 :=COUNTIFS($B$2:$B$194440,"<>",$B$2:$B$194440,"&l ...
- [统计信息系列7] Oracle 11g的自动统计信息收集
(一)统计信息收集概述 在Oracle 11g中,默认有3个自动任务,分别是:自动统计信息收集.SQL调优顾问.段空间调整顾问,查看方法如下: SQL> SELECT CLIENT_NAME,T ...
- Oracle 11gR2 待定的统计信息(Pending Statistic)
Oracle 11gR2 待定的统计信息(Pending Statistic) 官档最权威: 发布优化器统计信息的用户界面 管理已发布和待处理的统计信息 实验先拖着.
- Linux,du、df统计的硬盘使用情况不一致问题
[转]http://blog.linezing.com/?p=2136 Linux,du.df统计的硬盘使用情况不一致问题 在运维Linux服务器时,会碰到需要查看硬盘空间的情况,这时候,通常会使 ...
随机推荐
- CSS3的flex布局
flex的一些属性 CSS3中引入了另一种框--flexbox,flexbox有一些block和inline不同的性质,比如: 自适应子元素(flex item,又称伸缩项目)的宽度 伸缩项目的flo ...
- 包含块( Containing block ) 转自W3CHelp
包含块简介 在 CSS2.1 中,很多框的定位和尺寸的计算,都取决于一个矩形的边界,这个矩形,被称作是包含块( containing block ). 一般来说,(元素)生成的框会扮演它子孙元素包含块 ...
- 1Z0-053 争议题目解析685
1Z0-053 争议题目解析685 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 685.In your test database: -You are using Recover ...
- 让你分分钟学会Javascript中的闭包
Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...
- Java进击C#——语法之知识点的改进
本章简言 上一章我们讲到关于面向对象思想上C#和JAVA之差别.笔者分别从面向对象的三大特性入手.而本章主要讲一些C#改进的知识点.在.NET Framework 2.0之后出现很多新的知识点.这些知 ...
- iOS多线程技术方案
iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...
- vue-resource请求超时timeout设置
请求超时设置通过拦截器Vue.http.interceptors实现具体代码如下 main.js里在全局拦截器中添加请求超时的方法 方法1:超时之后会调用请求中的onTimeoutd方法,then方法 ...
- Revit读取当前rvt的所有视图与其名称
1)读取所有视图: public static ViewSet GetAllViews(Document doc) { ViewSet views = new ViewSet(); FilteredE ...
- 【C#】New操作符所做的事情
1.它计算类型以及所有基类型(一直到System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数.堆上的每个对象都需要一些额外的成员---即“类型对象指针”和“同步块索引 ...
- Devexpress Gantt 应用
甘特图属于甘特系列浏览次数(也称为时间或时间轴图表).此视图显示横条沿时间轴.每个条形代表一个单独的事件的开始和结束的值, 因此,这些图是用来跟踪各种活动的时间范围内(例如计划,利用各种资源,审查该项 ...




