临时表空间使用率100%,不同sql查询结果不一致原因分析

 

SQL 1:

 

Select 
f.tablespace_name
,sum(f.bytes_free + f.bytes_used) 
/1024/1024  "total MB"
,sum((f.bytes_free + f.bytes_used) - nvl(p.bytes_used, 0))
/1024/1024  "Free MB" 
,sum(nvl(p.bytes_used, 0))
/1024/1024 "Used MB"
,Round(sum(nvl(p.bytes_used, 0)) / sum(f.bytes_free + f.bytes_used) * 10000,0) || '%'  "USED_RATE(%)"  
from sys.v_$temp_space_header f, dba_temp_files d, sys.v_$temp_extent_pool p
where f.tablespace_name(+) = d.tablespace_name
and f.file_id(+) = d.file_id
and p.file_id(+) = d.file_id
group by
f.tablespace_name

显示临时表空间总共322MB,使用率31%

SQL 2:

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 sys.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;

 

显示临时表空间总共322MB,使用率100%

两种查询sql都是从网上找的,查询结果却天差地别,sql1查询临时表的使用率是根据sys.v_$temp_extent_pool的bytes_used字段得到利用率,sql2直接使用V$TEMP_SPACE_HEADER的BYTES_USED

视图v$temp_space_header显示的是每一个temp文件在某一个时刻使用过的最大大小,从本质上说,它显示的是每一个tempfile的初始化大小,而不是实际分配的块大小。
所以说从视图v$temp_space_header获取的数据其实并不是实际使用的大小,它是不准确的。那么肯定有人会问,脚本里面不是访问的GV_$TEMP_SPACE_HEADER视图吗? 跟这个视图v$temp_space_header有关系吗? 答案是有关系,他们的数据来源是一致的,也就是说来自相同的内部表。

所以说当查询临时表空间使用率100%,先别急着扩容,先分析下SQL是否准确。另外查询临时表空间建议参考如下sql

SELECT  T.TABLESPACE_NAME,
            round(( U.TOT_USED_BLOCKS / T.TOTAL_BLOCKS ) * 100,2)*100 || '%' AS "PERCENT USED" 
     FROM   (SELECT TABLESPACE_NAME,
                    SUM(USED_BLOCKS) TOT_USED_BLOCKS 
             FROM   V$SORT_SEGMENT 
             WHERE  TABLESPACE_NAME = 'TEMP'
             GROUP BY TABLESPACE_NAME) U, 
            (SELECT TABLESPACE_NAME,
                    SUM(BLOCKS) TOTAL_BLOCKS 
             FROM   DBA_TEMP_FILES 
             WHERE  TABLESPACE_NAME = 'TEMP'
             GROUP BY TABLESPACE_NAME) T;

相关内容来源网址http://www.cnblogs.com/kerrycode/p/5797233.html

你可能感兴趣的:(oracle)