对于临时表空间,主要用来做一些排序类的操作,oracle对于临时表空间采用的使用策略和其他的永久表空间的不同,当第一个使用临时表空间的排序操作开始,临时段被创建
相应视图:
SQL> select table_name from dict where table_name like 'V$TEMP%';
TABLE_NAME
------------------------------
V$TEMPFILE
V$TEMPORARY_LOBS
V$TEMPSEG_USAGE
V$TEMPSTAT
V$TEMP_CACHE_TRANSFER
V$TEMP_EXTENT_MAP
V$TEMP_EXTENT_POOL
V$TEMP_HISTOGRAM
V$TEMP_PING
V$TEMP_SPACE_HEADER
SQL> SELECT TABLE_NAME FROM DICT WHERE TABLE_NAME LIKE 'V$SORT%';
TABLE_NAME
------------------------------
V$SORT_SEGMENT
V$SORT_USAGE
1、v$sysstat(查看数据库排序信息)
SQL> select name,value from v$sysstat where name like 'sort%';
NAME VALUE
---------------------------------------------------------------- ----------
sorts (memory) 3272
sorts (disk) 0
sorts (rows) 16442
2、v$sort_usage=v$tempseg_usage(查看临时表空间使用情况)
SQL> select username,session_num from v$tempseg_usage;
USERNAME SESSION_NUM
------------------------------ -----------
SYS 8
SYS 8
SYS 8
3、v$sort_segment(临时段中的extent管理)
SQL> select TOTAL_EXTENTS,USED_EXTENTS,FREE_EXTENTS,ADDED_EXTENTS from v$sort_segment where tablespace_name='TEMP';
TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS
------------- ------------ ------------ -------------
902 0 902 898
v$temp_space_header(该视图用来查询临时表空间使用情况)
SQL> select tablespace_name,BYTES_USED,BYTES_FREE from v$temp_space_header;
TABLESPACE_NAME BYTES_USED BYTES_FREE
------------------------------ ---------- ----------
TEMP 946864128 0
extent会被分配到这个临时段中,但当排序操作完成后,这个临时段并不会被删除掉,只会被oracle标记为Free从而使其他排序操作可以继续使用这个临时段,从这里我们也可以明白,对于一个临时表空间只能存在一个临时段。对于段中的extent管理通过v$sort_segment:
SQL> select TOTAL_EXTENTS,USED_EXTENTS,FREE_EXTENTS,ADDED_EXTENTS from v$sort_segment where tablespace_name='TEMP';
TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS
------------- ------------ ------------ -------------
117 117 0 6571
当我们数据库中temp表空间不在被会话所使用,相应的临时段就会释放。extent被标记为Free
TOTAL_EXTENTS USED_EXTENTS FREE_EXTENTS ADDED_EXTENTS
------------- ------------ ------------ -------------
364 0 364 6818
从上面可知,一但开始使用临时段,oracle就会分配对应的extent,不断往段中添加extent,而一但排序操作完成,oracle会立即释放使用的段,从而使段中的extent标记为Free.
oracle的这一特性也使得oracle的临时表空间的数据文件将会越来越大,所以对于临时表空间我们也必须定期的观察并做维护。
模拟临时表空间被大量消耗:(模拟一个排序操作)
select * from dba_tab_columns a,dba_tab_columns b order by a.owner,b.table_name;
运行一段时间后掐掉,此时发现对应oracle目录变大,临时表空间也变大。
SQL> !df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 8254240 2244484 5590464 29% /
none 403460 0 403460 0% /dev/shm
/dev/sda2 10317860 6550784 3242956 67% /oracle
SQL> select username,session_num from v$sort_usage where tablespace='TEMP';
USERNAME SESSION_NUM
------------------------------ -----------
SYS 8
此时我们查找对应临时数据文件使用情况:
SQL> select max(SEGBLK#) from v$sort_usage;
MAX(SEGBLK#)
------------
9
SQL> select 8*8192/1024/1024/1024 from dual;
8*8192/1024/1024/1024
---------------------
.000061035
我们可以看到,虽然临时表空间很大,但是临时表空间的使用却不大,我们采用resize的方法缩小数据文件:
SQL> alter database tempfile '/oracle/app/oradata/orcl/temp01.dbf' resize 100m;
Database altered.
SQL> !ls -l /oracle/app/oradata/orcl/temp01.dbf
-rw-r----- 1 oracle dba 104865792
数据文件已经缩小到100m
减小临时表空间,释放磁盘空间的另一个方法是临时表空间的替换:
创建temp:
SQL> create temporary tablespace temp2
2 tempfile 'E:\XXXXXX\XXXXX\XXXX.dbf' size 100m autoextend on;
确认原temp是否空闲:
SQL> SELECT USERNAME,USER FROM V$SORT_USAGE WHERE TABLESPACE='TEMP'
SQL> alter database default temporary tablespace TEMP2
SQL> drop tablespace TEMP including contents and datafiles
查看是否正确删除temp表空间。
查看空间是否释放。