SELECT * FROM t order by 1;再其他会话查看表空间的使用率
-
SQL> select t1.TBS_NAME, round(t1.TOTAL_BYTES/1024/1024,2) || 'M' "TOTAL(M)",round(nvl(t2.FREE_BYTES,0)/1024/1024,2) || 'M' "FREE(M)",
-
2 round(100*(t1.TOTAL_BYTES-nvl(t2.FREE_BYTES,0))/t1.TOTAL_BYTES,2) || '%' "USED%" from
-
3 (select t.tablespace_name TBS_NAME,sum(bytes) TOTAL_BYTES from dba_temp_files t group by t.TABLESPACE_NAME) t1,
-
4 (select t.tablespace_name TBS_NAME,sum(free_space) FREE_BYTES from dba_temp_free_space t group by t.TABLESPACE_NAME) t2
-
5 where t1.tbs_name=t2.tbs_name(+)
-
6 order by (t1.TOTAL_BYTES-nvl(t2.FREE_BYTES,0))/t1.TOTAL_BYTES desc;
-
......
-
SQL> /
-
TBS_NAME TOTAL(M) FREE(M) USED%
-
------------------------------
-
TEMP01 500M 106M 78.8%
-
Elapsed: 00:00:00.00
-
-
SQL> /
-
TBS_NAME TOTAL(M) FREE(M) USED%
-
------------------------------
-
TEMP01 500M 76M 84.8%
-
Elapsed: 00:00:00.01
-
-
SQL> /
-
TBS_NAME TOTAL(M) FREE(M) USED%
-
------------------------------
-
TEMP01 500M 45M 91%
排序操作的确一直在使用临时表空间,随着语句的执行,使用率一直在增加。当操作完成后,再次查看临时表空间使用率为0%,说明系统已经自动回收。再翻过来看一下具体磁盘的占用情况:
-
oracle@linux-qtx3:~> du -sh /u01/app/oracle/oradata/orcl/temp001.dbf
-
501M /u01/app/oracle/oradata/orcl/temp001.dbf
临时文件磁盘空间一旦分配后不会被回收。
定位使用临时表空间语句
-
select t.USERNAME,t. SESSION_ADDR ,t.SESSION_NUM,t.SQL_ID,t.TABLESPACE,t.CONTENTS,t.SEGTYPE,t.BLOCKS from v$tempseg_usage t
-
USERNAME SESSION_ADDR SESSION_NUM SQL_ID TABLESPACE CONTENTS SEGTYPE BLOCKS
------------------------------ ---------------- ----------- ------------- ------------------------------- --------- --------- ----------
SCOTT 000000007F7AAD08 35 2zj5pgsgs6yhu TEMP01 TEMPORARY SORT 35200
上述语句可以精确定位到SQL的相关ID以及
ADDR,结合v$sql或者v$sqlarea等试图可轻松找到SQL语句的具体内容。
总之:
1.因为稀疏文件的特性,请确保临时表空间对应文件系统有相应的空间预留
2.查询已分配空间的临时表空间使用情况以及具体哪个会话和sql正在使用临时表空间语句如下
select t1.TBS_NAME, round(t1.TOTAL_BYTES/1024/1024,2) || 'M' "TOTAL(M)",round(nvl(t2.FREE_BYTES,0)/1024/1024,2) || 'M' "FREE(M)",
round(100*(t1.TOTAL_BYTES-nvl(t2.FREE_BYTES,0))/t1.TOTAL_BYTES,2) || '%' "USED%"
from
(select t.tablespace_name TBS_NAME,sum(bytes) TOTAL_BYTES from dba_temp_files t group by t.TABLESPACE_NAME) t1,
(select t.tablespace_name TBS_NAME,sum(free_space) FREE_BYTES from dba_temp_free_space t group by t.TABLESPACE_NAME) t2
where t1.tbs_name=t2.tbs_name(+)
order by (t1.TOTAL_BYTES-nvl(t2.FREE_BYTES,0))/t1.TOTAL_BYTES desc;
或者
select t.CURRENT_USERS,t.TOTAL_BLOCKS,t.USED_BLOCKS,t.FREE_BLOCKS from v$sort_segment t;
select t.USERNAME,t. SESSION_ADDR,t.SESSION_NUM,t.SQL_ID,t.TABLESPACE,t.CONTENTS,t.SEGTYPE,t.BLOCKS from v$tempseg_usage t
或者
select t.USERNAME,t. SESSION_ADDR,t.SESSION_NUM,t.SQL_ID,t.TABLESPACE,t.CONTENTS,t.SEGTYPE,t.BLOCKS from v$sort_usage t
(V$TEMPSEG_USAGE是v$sort_usage的同义词)
3.当监控到临时表空间使用率100%,但相关文件系统未满的时候,请检查临时数据文件是否设置过小且AUTOEXTENSIBLE设置为AUTOEXTEND OFF。针对此情况可适当增加临时文件大小或者添加临时数据文件。
另外,由于临时表空间并不真正存储永久性对象,在RMAN备份中并不备份临时表空间,其实即便备份也是在浪费时间,因为Oracle根本不会去恢复临时表空间。