临时表空间

临时表空间
1.什么是临时表空间
在Oracle数据库中进行排序、分组汇总、索引等到作时,会产生很多的临时数据。如有一张员工信息表,数据库中是安装记录建立的时间来保存的。 如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据。对于这些临时数据,Oracle数据库是如何处理的呢?通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区)内。在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序操作而产生的临时数据。但是这个分区的容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间中。这就是临时表空间的来历。看起来好像这个临时表空间是个临时工,对于数据库的影响不会有多大。 其实大家这是误解这个临时表空间了。在用户进行数据库操作时,排序、分组汇总、索引这些作业是少不了,其会产生大量的临时数据。为此基本上每个数据库都需要用到临时表空间。而如果这个临时表空间设置不当的话,则会给数据库性能带来很大的负面影响。

2.临时表空间作用
索引create或rebuild
Order by 或 group by
Distinct 操作
Union 或 intersect 或 minus
Sort-merge joins
analyze

3.临时表空间建立
以下命令是创建一个临时表空间.其命令和创建其它表空间不同的地方是增加temporay关建字.请注意.如果tablespace设置的是maxsize unlimited那么,临时表空间也会一直在需要的时候增长. 如果在创建数据库时没有指定默认临时表空间.那么会用system表空间作为默认临时表空间当system表空间是本地管理时,你必须定义最少一个默认表空间在创建数据库的时候.本地管理的system表空间不能作为默认临时表空间.
create temporary tablespace TEMP1 TEMPFILE '/oradata/TEMP1_01.dbf' size 100M;

临时表空间与正常的表空间还有以下区别
1.Tempfiles总是被设置为NOLOGGING模式
2.不能把一个tempfile设置成readonly模式
3.不能重命名一个tempfile
4.不能通过alter database来创建一个tempfile
5.当你创建或者重写tempfile大小的时候,数据通常不会自动分配tempfile指定的大小的
6.磁盘空间给它(即不会初始化),但是会在块被访问之前分配.(这也是为什么创建临时表空间会比平时表空间要快的多的原因)
7.tempfile的信息存储在dba_temp_files,动态视图v$tempfile中.不在dba_data_files或者v$datafile中.

临时表空间的信息不会记录在controlfile中,所以当启动打开数据库时,不会做临时表空间的校验,即,即使临时表空间不存在也可以打开数据库(默认情况下oracle会自动创建)

4.临时表空间修改大小
ALTER database TEMPFILE 'F:\oracle\product\10.2.0\oradata\obpm\TEMP01.dbf' resize 100M ;

5.临时表空间删除
drop tablespace temp01 including contents and datafiles;
注意以上语句并不会真正的删除dbf文件.所以下次新建的时候如果是已存在一的file最好在新建表空间语名中加上reuse

6.将当前临时表空间指定为新的临时表空间
alter database default temporary tablespace TEMP1;

查看当前数据库默认临时表空间:
select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE'

7.监空临时表空间使用大小
表空总大小
select tablespace_name,(blocks*8)/1024 from dba_temp_files;

表空间已使用大小
select (blocks*8)/1024 from v$sort_usage;

可以通过v$sort_usage查看具体的详细信息.比如是什么操作用到temp表空间.哪名sql,用了多少个段等等.

在dba_segment,dba_extents中没有查看临时表空间段和临时表空间的扩展.
据说临时表空间用了就不会回收段.想查证一下.但是没有找到资料,我看V$sort_usage的空间,用了就放了,不知道是不是由于10g不太一样.下次到群里咨询一下.
总的来说对于临时表空间的分配和回收空间还不太清楚

我在把pag=10m,做了一个3w条记录的砂笛卡尔连接.发现temp一直在往上涨.查询v$session_wait它的最多的等待事件是'direct path write temp','direct path read temp',说明如果是数据库出现大里的这两个事件即表明temp表空间的设置问题了

你可能感兴趣的:(数据库,Oracle,咨询,SQL,F#)