6.4 临时表空间的管理
临时表空间用于存储临时数据。当用户执行排序、创建索引这样的操作时,将产生大量的中间结果,这些临时数据将首先存储在PGA的排序区中。当排序区的大小不足以容纳这些数据时,将用到临时表空间。如果没有为用户指定临时表空间,那么用户在执行排序操作时将把SYSTEM表空间作为临时表空间,并在SYSTEM表空间中创建临时段,以存储临时数据。由于用户的排序操作会在SYSTEM表空间中频繁地产生临时段和释放临时段,这样在SYSTEM表空间中将产生大量的存储空间碎片,从而降低数据库的性能。Oracle建议在数据库中创建专门的临时表空间,并为用户指定一个临时表空间。
在临时表空间中只能创建临时段,而不能创建数据段、索引段等永久性的段。在数据库中第一次执行排序操作时,临时段自动创建,在数据库关闭时,临时段被删除。这些临时段为所有用户所共享。
6.4.1 临时表空间的创建
就像创建普通表空间一样,在创建临时表空间时需要指定区管理方式、段管理方式、区的大小等信息,也可以创建大文件临时表空间。在创建表空间时需要指定关键字TEMPORARY。例如,以下语句用来创建本地管理临时表空间tts1:
SQL>CREATE TEMPORARY TABLESPACE tts1
TEMPFILE'/home/oracle/tts11.dbf'SIZE 10M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 128K;
在创建本地管理临时表空间时,首先要用关键字TEMPORARY指定表空间的类型为临时性的,其次,要通过TEMPFIL子句指定表空间的数据文件,而不是使用DATAFFILEF子句。另外,只能通过UNIFORM子句为临时表空间指定的区大小,而不能使用AUTOALLOCATE子句。
在创建临时表空间时,Oracle建议将临时表空间的大小设置为排序区的整数倍,以减少存储空间的碎片,使数据库获得最佳性能。排序区的大小通过初始化参数SORT_AREA_SIZE来确定。
临时表空间的作用仅限于存储临时数据,因而与普通表空间相比它有一些特殊的地方。从数据字典视图dba_tablespaces中查询临时表空间的信息时,发现LOGGING列的值为NOLOGGING,这就意味着对临时空间中的数据所做的任何修改都不会产生重做日志。用户执行排序等操作时,临时文件中的数据是不断变化的,因而临时文件的访问权限不能为只读方式。另外,还需要注意的是,临时表空间中的数据文件的信息是从数据字典视图dba_temp_files中获得的。
在创建数据库时,默认就创建了一个临时表空间,它就作为数据库的默认临时表空间。如果更改数据库的临时表空间,可以执行下面的ALTER语句:
SQL>ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tts1;
临时表空间的删除方法与普通表空间相同,这里不再介绍。