每一个Oracle版本,都会有很多新特性和技术推出。这些技术特性,在很大程度上都能改进Oracle运行效率和应用效果,或者提高我们日常工作能力。
Temp表空间是Oracle表空间体系中一种很特殊的表空间对象。临时表空间主要用于支持临时表空间使用、排序分组动作空间溢出暂存等作用。我们对Temp的使用,大都是局限在空间分配和大小设置上。在11g有,有一系列针对Temp表空间的新特性,可以很大程度上帮助我们工作。
视图dba_temp_free_space是11g引入的一个新视图,用于描述临时表空间使用情况。
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 479199232
最近和一个朋友聊起其中allocated_space和free_space的含义,觉得很有意思。笔者决定通过一些实验来证明结论。
1、环境准备
笔者使用Oracle11gR2环境进行测试。
SQL> select * from v$version;
BANNER
------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
当前仅包括默认的Temp临时表空间。
SQL> select file_name, file_id, tablespace_name from dba_temp_files;
FILE_NAME FILE_ID TABLESPACE_NAME
------------------------------ ---------- ------------------------------
/u01/app/oradata/ORA11G/datafi 1 TEMP
le/o1_mf_temp_92t73qm8_.tmp
说明:为减少系统对实验结果影响,笔者创建全新的临时表空间,通过一系列的典型操作来,监控字段变化形态来证明实验结论。
2、表空间创建过程
首先我们创建临时表空间temptest。之前,我们检查磁盘空间空闲情况:
[oracle@SimpleLinux ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 24G 22G 52% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
当前/目录对应大小48G,使用24G,有22G可用空间。下面创建表空间:
SQL> create temporary tablespace temptest tempfile size 5G
2 extent management local uniform size 1m;
Tablespace created
和创建同样大小数据表空间相比起来,执行创建临时表空间语句速度很快。之后查看磁盘空间情况。
[oracle@SimpleLinux ~]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 24G 22G 52% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
容量上没有任何变化,如果Oracle创建了5G空间,至少会显示在磁盘大小上。但是,从Oracle内部注册体系和文件系统中,我们都是可以看到临时文件的生成。
SQL> select file_name, file_id, tablespace_name from dba_temp_files;
FILE_NAME FILE_ID TABLESPACE_NAME
------------------------------ ---------- ---------------
/u01/app/oradata/ORA11G/datafi 1 TEMP
le/o1_mf_temp_92t73qm8_.tmp
/u01/app/oradata/ORA11G/datafi 2 TEMPTEST
le/o1_mf_temptest_9j80859z_.tm
p
[oracle@SimpleLinux datafile]$ ls -l | grep temptest
-rw-r----- 1 oracle oinstall 5368717312 Feb 19 08:55 o1_mf_temptest_9j80859z_.tmp
这个是Oracle临时数据文件的特性,Oracle临时文件和数据文件不同,创建之后是不直接占满空间的。我们都有这样的经历,创建一个很大的数据表空间,create/add过程依据不同的系统IO情况,是很消耗时间的。但是临时文件不是,一个上十几G的临时文件可以在很快的创建成功。
但是,这个过程其实是“障眼法”。Oracle虽然创建了临时文件,文件系统中也分配显示大小文件,但是空间却没有真正的分配。这在一些文献中称为“稀疏文件”,文件架构范围都在,但是没有实际写入过程。TempFile中的allocated,也就与稀疏文件有关。
注意:这就告诉我们系统部署人员,要注意临时文件的这个特性,不要以为磁盘上有很多的空间。
此时,我们观察视图dba_temp_free_space,结果如下:
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5368709120 1048576 5367660544
Tablespace_size为5368709120bytes大小,折合5G。这就是我们对临时表空间Temptest的定义值。
Allocated_space为1048576bytes,折合1M。我们创建了临时文件,即使是稀疏结构,在文件系统上也会有一些元数据信息占据空间。此时的allocated_space=1M也是合理的。
Free_Space为5367660544bytes,折合5119M。如果加入1M(allocated_size),就是5120M,折合5G,与Tablespace_size对应。
目前数据库没有使用temptest进行操作,所以对新的临时文件而言,我们可以得到如下结论:
ü 新创建的数据文件是以“稀疏文件”的方式,虽然创建成功,但是在文件系统中不是写入完全,空间占据是没有分配的状态;
ü 新创建文件情况下:Allocated_space最开始表示元数据信息;
ü 新创建文件情况下:Free_Space表示没有分配的空间;
下面我们使用临时表进行空间使用。
3、临时表使用情况下实验
临时表常见的场景是临时数据表。Oracle临时表的数据都是保存在临时表空间里面,当向数据表中insert插入数据之后,就会伴随Temp临时段的分配。
首先创建出临时表:
SQL> create global temporary table t_temp tablespace temptest as select * from t where 1=0;
Table created
SQL> select count(*) from t_temp;
COUNT(*)
----------
0
创建之后,查看dba_temp_free_space视图变化。
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5368709120 1048576 5367660544
空临时表数据段,没有引起临时表空间分配动作。插入数据,笔者过去准备过一个约2G数据表,插入到临时表中。
SQL> insert into t_temp select * from t;
19360512 rows inserted
插入动作比较慢,之后检查操作系统层面分配情况。
[oracle@SimpleLinux datafile]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 26G 20G 57% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
[oracle@SimpleLinux datafile]$ ls -l | grep temptest
-rw-r----- 1 oracle oinstall 5368717312 Feb 19 09:10 o1_mf_temptest_9j80859z_.tmp
注意:文件系统层面发生了变化,刚创建5G文件的时候,是没有额外的变化的。插入2G数据之后,存储层面发生变化。Used字段从24G上升到26G。这说明:插入过程才进行文件层面的分配,分配约2G空间给稀疏文件。
视图情况如下:
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5368709120 2248146944 3120562176
Allocated_space为2248146944bytes,合计2144M,进而2.09G空间。Free_Space为3120562176bytes,合计2976M,进而2.90625G。两者合计依然能够保持5G。
Allocated_Space此时显然包括正在使用临时表所在空间大小,也就是本次进行文件拓展的情况。Free_Space是没有在文件系统中分配的大小。
SQL> select sql_id, tablespace, contents, segtype, extents, blocks from v$tempseg_usage;
SQL_ID TABLESPACE CONTENTS SEGTYPE EXTENTS BLOCKS
------------- ------------------------------- --------- --------- ---------- ----------
9m7787camwh4m TEMPTEST TEMPORARY DATA 2143 274304
此时,我们得到结论:当使用Temp空间的时候,需要从文件系统中请求空间使用。Allocated_space表示正在使用的空间对象,而Free_Space表示没有分配给稀疏文件的空间。
下面,我们释放这部分临时段对象。
4、Commit后的数据情况
我们将数据commit之后,数据表t_temp临时段就会自动释放。后台进程smon就会回收空间。
SQL> commit;
Commit complete
SQL> select count(*) from t_temp where rownum<10;
COUNT(*)
----------
0
SQL> select sql_id, tablespace, contents, segtype, extents, blocks from v$tempseg_usage;
SQL_ID TABLESPACE CONTENTS SEGTYPE EXTENTS BLOCKS
------------- ------------------------------- --------- --------- ---------- ----------
此时,dba_temp_free_space的结果如下:
SQL> select * from dba_temp_free_space;
TABLESPACE_NAME TABLESPACE_SIZE ALLOCATED_SPACE FREE_SPACE
--------------- --------------- --------------- ----------
TEMP 481296384 481296384 480247808
TEMPTEST 5368709120 2248146944 5367660544
Tablespace_size大小依然为5G。Allocated_Space为2248146944,合计2144M,约为2.09G。注意:这个大小和刚刚我们使用临时表时候是一样的!也就是等于在稀疏文件中分配的大小。
Free_space为5367660544,合计5119M。和没有使用Temptest前是相同的(5G-1M)。表示当前可以使用的临时空间。
临时段释放之后,文件系统中是不会将分配的空间进行回收的。
[oracle@SimpleLinux datafile]$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 48G 26G 20G 57% /
tmpfs 6.0G 256M 5.8G 5% /dev/shm
/dev/mapper/VolGrp01-lv1
194M 5.6M 179M 4% /voltest01
5、结论
经过上面的分析,我们可以清晰地看到dba_free_temp_space的字段含义和Temp情况。
Allocated Space表示文件系统中给临时表空间稀疏文件真实分配的大小,也就是某个时候系统使用这个临时表空间最大的位置(类似于HWM)。从组成上,这个大小三部分组成:元数据信息(1M)、正在使用的临时段空间、当前没有使用但是曾经使用过的临时段空间。
Free_space表示的维度是从实用角度入手,表示当前表空间有多大空间可以使用。包括:当前没有使用但是曾经使用过的临时段空间、稀疏文件中未分配部分。
两个字段体积中有一部分属于共享,是当前没有使用但是曾经使用过的临时段空间部分。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-1084026/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-1084026/