为什么临时表空间预分配30M却实际占用2M存储?

Rain 2018-10-03

概述

在Oracle数据库中进行排序、分组汇总、索引等到作时,会产生很多的临时数据。如有一张员工信息表,数据库中是安装记录建立的时间来保存的。如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据。对于这些临时数据,Oracle数据库是如何处理的呢?

通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区)内。在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序操作而产生的临时数据。但是这个分区的容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间中。这就是临时表空间的来历。看起来好像这个临时表空间是个临时工,对于数据库的影响不会有多大。其实大家这是误解这个临时表空间了。在用户进行数据库操作时,排序、分组汇总、索引这些作业是少不了,其会产生大量的临时数据。为此基本上每个数据库都需要用到临时表空间。而如果这个临时表空间设置不当的话,则会给数据库性能带来很大的负面影响。


为临时表空间预留足够的硬盘空间

对于临时表空间的临时文件,DBA最好能够预先为其保留足够的空间。如在 Linux 操作系统中,可以将其放置在一个独立的分区内,不允许其他应用程序使用。这样就不用担心临时文件没有地方存储了或者因为空间满而导致其他数据文件也受到影响。

另外,由于临时表空间主要用来存放一些排序用的临时文件。为此如果能够将这个临时表空间存放在性能比较好的分区中, 还可以提高数据库系统读取临时表空间中数据的速度。

再者,由于系统需要频繁分配临时表空间中的数据,为此临时表空间所在的分区会出现比较多的碎片。此时如果将临时表空间存放在一个独立的分区内,那么数据库管理员就可以单独对这个分区进行碎片整理,从而提高这个分区的性能。

总之,分配临时表空间时建议将临时表空间放置在一个独立的分区内。不仅可以保证临时文件有存储的空间,而且还可以提高数据库的性能。


实验:测试临时表空间实际大小

1、创建临时表空间30M:

create temporary tablespace temp01 tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' size 30M;

为什么临时表空间预分配30M却实际占用2M存储?

2、查看临时表空间占用的空间

通过du -sh *命令可查看临时表空间大小。

为什么临时表空间预分配30M却实际占用2M存储?

可以看到临时表空间只占了2.1M存储。

原因:临时表空间预分配大小

除了临时表空间,其他表空间对应的数据文件,在其创建时就会被完全分配和初始化,即在其创建时就会被分配存储空间。 但是临时表空间对应的临时文件则不同。 如在 Linux 操作系统中,临时表空间创建时系统是不会分配和初始化临时文件的。也就是说,不会为临时文件分配存储空间。只有临时数据出现需要用到临时文件的时候,系统才会在硬盘上分配一块地方用来保存临时文件。

临时表空间是预分配30M,但实际上不占这么多存储,只是先分配了2.1M。


上面的实验还是有点欠缺考虑,大家有空可以试下,用dba角色去创建临时表空间和普通用户角色去创建临时表空间,然后看下表空间是不是立即分配还是延时分配,篇幅有限,就先测试到这里了。

觉得文章有点用的可以点下关注哦,后面会分享更多实验,例如位图块,监听、ogg之类的实验。

为什么临时表空间预分配30M却实际占用2M存储?

相关推荐