Oracle临时表空间主要用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。

重启数据库可以释放临时表空间,如果不能重启实例,而一直保持问题sql语句的执行,temp表空间会一直增长。直到耗尽硬盘空间。

网上有人猜测在磁盘空间的分配上,oracle使用的是贪心算法,如果上次磁盘空间消耗达到1GB,那么临时表空间就是1GB。也就是说当前临时表空间文件的大小是历史上使用临时表空间最大的大小。

临时表空间的主要作用:

索引createrebuild

Orderbygroupby

Distinct操作

Unionintersectminus

Sort-mergejoins

analyze

1.select*fromv$tablespace;(查询空间)

selecttablespace_name,file_name,bytes/1024/1024file_size,autoextensiblefromdba_temp_files;

2.创建临时表空间

CREATETEMPORARYTABLESPACEtemp02TEMPFILE'E:\app\Administrator\oradata\orcl\temp02.dbf'
SIZE200mAUTOEXTENDONNEXT32mMAXSIZE2048mEXTENTMANAGEMENTLOCAL;

3.DROPTABLESPACEtemp02INCLUDINGCONTENTSANDDATAFILES;(删除临时表空间)

4.表空间收缩

alterdatabasetempfile'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP02.DBF'resize200M;

5.查询临时表空间的大小

selecttablespace_name,file_name,bytes/1024/1024file_size,autoextensiblefromdba_temp_files;

6.向临时表空间中添加数据文件:

altertablespacetempaddtempfile'E:\APP\ADMINISTRATOR\ORADATA\ORCL\TEMP03.DBF'size100m;

selecttablespace_name,file_name,bytes/1024/1024file_size,autoextensiblefromdba_temp_files;

7.更改系统默认表空间

--查询默认临时表空间
select*fromdatabase_propertieswhereproperty_name='DEFAULT_TEMP_TABLESPACE';
--修改默认临时表空间
alterdatabasedefaulttemporarytablespacetemp1;
所有用户的默认临时表空间都将切换为新的临时表空间:
selectusername,temporary_tablespace,default_fromdba_users;
--更改某一用户的临时表空间:
alteruserscotttemporarytablespacetemp;

8.查看临时表空间的使用情况GV_$TEMP_SPACE_HEADER视图必须在sys用户下才能查询)
GV_$TEMP_SPACE_HEADER视图记录了临时表空间的使用大小与未使用的大小
dba_temp_files视图的bytes字段记录的是临时表空间的总大小
SELECTtemp_used.tablespace_name,
total-usedas"Free",
totalas"Total",
round(nvl(total-used,0)*100/total,3)"Freepercent"
FROM(SELECTtablespace_name,SUM(bytes_used)/1024/1024used
FROMGV_$TEMP_SPACE_HEADER
GROUPBYtablespace_name)temp_used,
(SELECTtablespace_name,SUM(bytes)/1024/1024total
FROMdba_temp_files
GROUPBYtablespace_name)temp_total
WHEREtemp_used.tablespace_name=temp_total.tablespace_name

9.查找消耗资源比较的sql语句
Selectse.username,
se.sid,
su.extents,
su.blocks*to_number(rtrim(p.value))asSpace,
tablespace,
segtype,
sql_text
fromv$sort_usagesu,v$parameterp,v$sessionse,v$sqls
wherep.name='db_block_size'
andsu.session_addr=se.saddr
ands.hash_value=su.sqlhash
ands.address=su.sqladdr
orderbyse.username,se.sid

10.查看当前临时表空间使用大小与正在占用临时表空间的sql语句
selectsess.SID,segtype,blocks*8/1000"MB",sql_text
fromv$sort_usagesort,v$sessionsess,v$sqlsql
wheresort.SESSION_ADDR=sess.SADDR
andsql.ADDRESS=sess.SQL_ADDRESS
orderbyblocksdesc;

11.临时表空间组

1)创建临时表空间组

createtemporarytablespacetempts1tempfile'E:\APP\ADMINISTRATOR\ORADATA\ORCL\temp1_02.dbf'size100Mtablespacegroupgroup1;
createtemporarytablespacetempts2tempfile'E:\APP\ADMINISTRATOR\ORADATA\ORCL\temp2_02.dbf'size100Mtablespacegroupgroup2;

2)查询临时表空间组:dba_tablespace_groups视图
select*fromdba_tablespace_groups;
GROUP_NAMETABLESPACE_NAME
------------------------------------------------------------
GROUP1TEMPTS1
GROUP2TEMPTS2

3)将表空间从一个临时表空间组移动到另外一个临时表空间组:
altertablespacetempts1tablespacegroupGROUP2;
select*fromdba_tablespace_groups;
GROUP_NAMETABLESPACE_NAME
------------------------------------------------------------
GROUP2TEMPTS1
GROUP2TEMPTS2
4)把临时表空间组指定给用户
alteruserscotttemporarytablespaceGROUP2;
5)在数据库级设置临时表空间
alterdatabasedefaulttemporarytablespaceGROUP2;
6)删除临时表空间组(删除组成临时表空间组的所有临时表空间)
droptablespacetempts1includingcontentsanddatafiles;
select*fromdba_tablespace_groups;
GROUP_NAMETABLESPACE_NAME
------------------------------------------------------------
GROUP2TEMPTS2
droptablespacetempts2includingcontentsanddatafiles;
select*fromdba_tablespace_groups;
GROUP_NAMETABLESPACE_NAME
12、对临时表空间进行shrink(11g新增的功能)
--将temp表空间收缩为20M
altertablespacetempshrinkspacekeep20M;
--自动将表空间的临时文件缩小到最小可能的大小
ALTERTABLESPACEtempSHRINKTEMPFILE'E:\APP\ADMINISTRATOR\ORADATA\ORCL\temp2_02.dbf';

不推荐使用一个非常大的临时表空间,而应该考虑使用一些较小的临时表空间,并且创建一个临时表空间组来保存它们。