Oracle 表空间

Oracle磁盘空间管理中的最高逻辑层是表空间(TABLESPACE),它的下一层是段(SEGMENT),而且一个段只能驻留在一个表空间内。段的下一层就是盘区,一个或多个盘区(EXTENT)能够组成一个段,而且每一个盘区只能驻留在一个数据文件中。若是一个段跨越多个数据文件,它就只能由多个驻留在不一样数据文件中的盘区构成。盘区的下一层就是数据块,它也是磁盘空间管理中逻辑划分的最底层,一组连续的数据块能够组成一个盘区。
这里写图片描述
若是要查询表空间与对应的数据文件的相关信息,能够DBA_DATA_FILES数据字典得到,以下css

col tablespace_name for a10;
col file_name for a50;
col bytes for 999,999,999;
select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;

这里写图片描述
从查询所列的结果来看,一个数据库包括多个表空间,好比,SYSTEM表空间、USERS表空间等等。而每个表空间又包含一个或多个数据文件,好比,USERS表包括一个数据文件USERS01.DBF,表空间能够当作是Oracle数据库的逻辑结构,而数据文件能够当作是Oracle数据库的物理结构。
Oracle 11g的默认表空间
1. SYSTEM表空间
Oracle数据库的每一个版本都使用SYSTEM表空间存放内部数据和数据字典,SYSTEM表空间主要存放SYS用户的各个对象和其余用户的少许对象。用户能够从DBA_SEGMENTS数据字典中查询到某个表空间所存放的数据对象及其类型(如,索引、表、簇等)和拥有者。
查询USERS表空间内存放的数据对象及其类型和拥有者,代码以下:web

col owner for a10;
col segment_name for a30;
col segment_type for a20;
select segment_type,segment_name,owner from dba_segments where tablespace_name='USERS';

这里写图片描述
USERS表空间存放了SCOTT用户的表和索引,以及OE用户的大对象索引、索引等数据对象。sql

  1. SYSAUX表空间

SYSTEM表空间主要用于存放Oracle系统内部的数据字典,而SYSAUX表空间充当SYSTEM的辅助表空间,主要用于存储除数据字典之外的其余数据对象,它在必定程度上下降了SYSTEM表空间的负荷。
下面经过DBA_SEGMENTS数据字典来查询SYSAUX表空间的相关信息。数据库

select owner as 用户,count(segment_name) as 对象数量 from dba_segments where tablespace_name='SYSAUX' group by owner;

注意:用户能够对SYSAUX表空间进行增长数据文件和监视等操做,但不能对其执行删除、重命名或设置只读(READ ONLY)等操做。apache

  1. 建立表空间
CREATE [SMALLFILE/BIGFILE] TABLESPACE tablespace_name DATAFILE ‘/path/filename’ SIZE num[k/m] REUSE [,’/path/filename’ SIZE num[k/m] REUSE] [,…] [AUTOEXTEND [ON | OFF] NEXT num[k/m] [MAXSIZE [UNLIMITED | num[k/m]]]] [MININUM EXTENT num[k/m]] [DEFAULT STORAGE storage] [ONLINE | OFFLINE] [LOGGING | NOLOGGING] [PERMANENT | TEMPORARY] [EXTENT MANAGEMENT DICTIONARY | LOCAL [AUTOALLOCATE | UNIFORM SIZE num[k/m]]]]

在上面的语法中出现了大量的关键字和参数
1.语法中的关键字
- SMALLFILE/BIGFILE:表示建立的是小文件表空间仍是大文件表空间。
- AUTOEXEND [ON | OFF] NEXT:表示数据文件为自动扩展(ON)或非自动扩展(OFF),若是是自动扩展,则须要设置NEXT的值。
- MAXSIZE:表示当数据文件自动扩展时,容许数据文件扩展的最大长度字节数,若是指定UNLIMITED关键字,则不须要指定字节长度。
- MINIMUN EXTENT:指定最小的长度,由操做系统和数据库的块决定。
- ONLINE | OFFLINE:建立表空间时能够指定为在线或离线。
- PERMANENT|TEMPORARY:指定建立的表空间是永久表空间或临时表空间,默认为永久性表空间。
- LOGGING |NOLOGGING:指定该表空间内的表在加载数据时是否产生日志,默认为产生日志(LOGGING)。即便设置为NOLOGGING,但在进行INSERT,UPDATE和DELETE操做时,Oracle仍会将操做信息记录到RedoLog Buffer中。
- EXTENT MANAGEMENT DICTIONARY |LOCAL:指定表空间的扩展方式是使用数据字典管理仍是本地化管理,默认为本地化管理。Oracle不推荐使用数据字典管理表空间。
- AUTOALLOCATE | UNIFORM SIZE:若是采用本地化管理表空间,在表空间扩展时,指定每次盘区扩展的大小是由系统自动指定仍是按照等同大小进行。如果按照等同大小进行,则默认每次扩展的大小为1MB。
2.语法中的参数
- tablespace_name:该参数表示要建立的表空间的名称。
- /path/filename’:该参数表示数据文件的路径与名字;REUSE表示若该文件存在,则清除该文件在从新创建该文件,若该文件不存在,则建立该文件。
- DEFAULT STORAGE storage:指定之后要建立的表、索引及簇的存储参数值,这些参数将影响之后表等的存储参数值。ruby

经过本地化管理方式建立表空间
本地化表空间管理使用位图跟踪表空间所对应的数据文件的自由空间和块的使用状态,位图中的每一个单元对应一个块或一组块。当分配或释放一个扩展时,Oracle会改变位图的值以指示该块的状态。这些位图值的改变不会产生回滚信息,由于它们不更新数据字典的任何表。因此,本地管理表空间具备如下优势。
使用本地化的扩展管理功能(包括自动大小和等同大小两种),能够避免发生重复的空间管理操做。
本地化管理的自动扩展(AUTOALLOCATE)可以跟踪临近的自由空间,这样能够消除结合自由空间的麻烦。本地化的扩展大小能够由系统自动肯定(AUTOALLOCATE),也能够选择全部扩展有一样的大小(UNIFORM)。一般使用EXTENT MANAGEMENT LOCAL子句建立本地化的可变表空间。
经过本地化管理方式(LOCAL)建立一个表空间,其扩展大小为等同的256k,代码及运行结果以下。服务器

SQL> create tablespace tbs_test_1 datafile 'D:\OracleFiles\OracleData\datafile1.dbf'
  2  size 10m
  3  extent management local uniform size 256K;

经过本地化管理方式(LOCAL)建立一个表空间,其扩展大小为自动管理网络

SQL> create tablespace tbs_test_2 datafile 'D:\OracleFiles\OracleData\datafile2.dbf'
  2  size 10m
  3  extent management local autoallocate;

当建立扩展大小等同的表空间时,使用uniform关键字,并指定每次扩展时的大小;当建立扩展大小为自动管理时,使用autoallocate关键字,而且不须要指定扩展时的大小。
经过段空间管理方式建立表空间
段空间管理方式是创建在本地化空间管理方式基础之上的,即只有本地化管理方式的表空间,才能在其基础上进一步创建段空间管理方式,它使用“SEGMENT SPACE MANAGEMENT MANUAL/LOCAL”语句,段空间管理又可分为手工段和自动段两种空间管理方式。
1.手工段空间管理方式
手工段空间管理方式是为了日后兼容而保留的,它使用自由块列表和PCT_FREE与PCT_USED参数来标识可供插入操做使用的数据块。
在每一个INSERT或UPDATE操做后,数据库都会比较该数据块中的剩余自由空间与该段的PCT_FREE设置。若是数据块的剩余自由空间少于PCT_FREE自由空间(也就是说剩余空间已经进入系统的下限设置),则数据库就会从自由块列表上将其取下,再也不对其进行插入操做。剩余的空余空间保留给可能会增大该数据块中行大小的UPDATE操做。
而在每一个UPDATE操做或DELETE操做后,数据库会比较该数据块中的已用空间与PCT_USED设置,若是已用空间少于PCT_USED已用空间(也就是已用空间未达到系统的上限设置),则该数据块会被加入到自由列表中,供INSERT操做使用,下面来看一个实例。app

---经过本地化管理方式(LOCAL)建立一个表空间,其扩展大小为自动管理,其段空间管理方式为手工
create tablespace tbs_test_3 datafile 'E:\OracleFiles\OracleData\datafile3.dbf' size 10m extent management local autoallocate;
segment space management manual;

2.自动段空间管理方式
若是采用自动段空间管理方式,那么数据库会使用位图而不是自由列表来标识哪些数据块能够用于插入操做,哪些数据块须要从自由块列表上将其取下。此时,表空间段的PCT_FREE和PCT_USED参数会被自动忽略。
因为自动段空间管理方式比手工段空间管理方式具备更好的性能,因此它是建立表空间时的首选方式,下面来看一个实例。svg

----经过本地化管理方式(LOCAL)建立一个表空间,其扩展大小为自动管理,其段空间管理方式为自动
  create tablespace tbs_test_4 datafile 'D:\OracleFiles\OracleData\datafile4.dbf' size 20m extent management local autoallocate segment space management auto;
  • 自动段空间管理方式不能用于建立临时表空间和系统表空间。
  • Oracle自己推荐使用自动段空间管理方式管理永久表空间,但其默认状况下倒是MANUAL(手工)管理方式,因此在建立表空间时须要明确指定为AUTO。

建立非标准块表空间
在Oracle数据库中,一般的块大小为8192字节,即8KB,但Oracle 11g容许建立块大小与基本块不一样的表空间,块大小可由建立表空间时的blocksize参数指定,这样有利于存储不一样大小的对象,但用户须要注意如下三点:
- 表空间的非标准块的大小为基本块的倍数。好比,大小为16KB,64KB,128KB。
- Oracle 11g一般使用SGA自动共享内存管理,所以须要设置初始化参数db_16k_cache_size=16K。
- 这种块较大的表空间一般用来存放大对象(LOB)类型。
建立一个非标准块的表空间,块的大小为标准块的2倍

SQL> alter system set db_16k_cache_size = 16M scope=both; 
SQL> create tablespace tbs_test_5 datafile 'D:\OracleFiles\OracleData\datafile5.dbf'
  2  size 64m reuse
  3  autoextend on next 4m maxsize unlimited
  4  blocksize 16k
  5  extent management local autoallocate
  6  segment space management auto;

说明:若不设置初始化参数“db_16k_cache_size”,则Oracle会显示“ORA-29339: 表空间块大小 16384与配置的块大小不匹配”这样的提示信息。
创建大文件表空间
从Oracle 11g版本开始,引进了一个新的表空间类型——大文件(BIGFILE)。与之前版本的最多可由1022个文件组成的表空间不一样;大文件表空间存放在一个单一的数据文件中,而且它须要更大的磁盘容量来存放数据;大文件表空间能够根据选择的块的大小变化,从32TB增至128TB。
大文件表空间是为超大型数据库而设计的。当一个超大型数据库具备上千个读/写数据文件时,必须更新数据文件头部(好比检查点)的操做可能会花费至关长的时间。若是下降数据文件的数量,那么,这些操做完成起来就可能会快的多。建立一个大文件表空间,只须要在CREATE语句中使用BIGFILE关键字便可,下面来看一个例子。
建立一个大文件表空间,指定一个数据文件,而且数据文件的大小为2g

SQL> create bigfile tablespace tbs_test_big datafile 'D:\OracleFiles\OracleData\datafilebig.dbf'
  2  size 2g;

注意:在建立大文件表空间时,因为指定的数据文件都比较大,因此一般这个建立过程都比较慢一些,用户要耐心等待,不要急于结束操做。
说明:大文件(BIGFILE)表空间主要被使用在存储区域网络上(SAN)、磁盘阵列上、自动存储管理(ASM)上和相似的提供禁止数据访问多设备的存储解决方案上。
因为大文件(BIGFILE)表空间只有一个数据文件,因此,当须要从新设置其大小时不须要标识数据文件的具体路径和名称,只须要使用ALTER TABLESPACE命令指定大文件表空间的名称,便可很方便地修改其大小。另外,须要注意的是:在建立表空间的语法中使用size来标识数据文件的大小,而在修改表空间时,要使用resize关键字来重置数据文件的大小。修改大文件表空间tbs_test_big,将其空间大小由2g改变为1g

SQL> alter tablespace tbs_test_big resize 1g;
与大文件表空间不一样的是,传统表空间可能包含多个数据文件,若是要改变其大小,则须要在ALTER DATABASE语句后面指定完整的操做系统路径名或内部文件号辨别每一个数据文件,而后再从新设置他们的大小。 把数据文件datafile3.dbf(其所属的表空间是tbs_test_3)的大小由原来的20m修改成100m,代码及运行结果以下。

SQL> alter database datafile ‘D:\OracleFiles\OracleData\datafile3.dbf’
2 resize 100m;

维护表空间与数据文件
设置默认表空间
在Oracle数据库中建立用户(使用CREATE USER语句)时,若是不指定表空间,则默认的临时表空间是TEMP,默认的永久表空间是SYSTEM,这样就致使应用系统与Oracle系统竞争使用SYSTEM表空间,会极大地影响Oracle系统的执行效率。为此,Oracle建议将非SYSTEM表空间设置为应用系统的默认永久表空间,而且将非TEMP临时表空间设置为应用系统的临时表空间。这样有利于数据库管理员根据应用系统的运行状况适时调整默认表空间和临时表空间。
更改默认临时表空间须要使用ALTER DATABASE DEFAULT TEMPRORY TABLESPACE 语句,更改默认永久表空间须要使用ALTER DATABASE DEFAULT TABLESPACE 语句

----将临时表空间temp_1设置为默认的临时表空间
SQL>alter database default temprory tablespace temp_1
      -----将表空间tbs_example设置为默认的永久表空间
SQL>alter database default tablespace tbs_example

更改表空间的状态
表空间有只读和可读写两种状态,若设置某个表空间为只读状态,则用户就不可以对该表空间中的数据进行DML操做(INSERT、UPDATE、DELETE),但对某些对象的删除操做仍是能够进行的,好比,索引和目录就能够被删除掉;若设置某个表空间为可读写状态,则用户就能够对表空间中的数据进行任何正常的操做,这也是表空间的默认状态。
设置表空间为只读状态,能够保证表空间数据的完整性。一般在进行数据库的备份、恢复及历史数据的完整性保护时,可将指定的表空间设置成只读状态。但设置表空间为只读并非能够随意进行的,必需要知足下列条件。

  • 该表空间必须为ONLINE状态。
  • 该表空间不能包含任何回滚段。
  • 该表空间不能在归档模式下。

    更改表空间的读写状态须要使用ALTER TABLESPACE…READ|READ WRITE语句

-----修改tbs_test_3表空间为只读状态,代码及运行结果以下。
SQL> alter tablespace tbs_test_3 read only;
   ------ 修改tbs_test_3表空间为可读写状态,代码及运行结果以下。
SQL> alter tablespace tbs_test_3 read write;

重命名表空间
Oracle 11g提供了对表空间进行重命名的新功能,这对于通常的管理和移植来讲是很是方便的。
但要注意的是:数据库管理员只能对普通的表空间进行改名,不可以对SYSTEM和SYSAUX表空间进行重命名,也不能对已经处于OFFLINE状态的表空间进行重命名。
重命名表空间须要使用ALTER TABLESPACE…RENAME TO语句

-----把tbs_test_3表空间重命名为tbs_test_3_new,代码及运行结果以下。 SQL> alter tablespace tbs_test_3 rename to tbs_test_3_new;

说明:在修改完表空间名称以后,原表空间中所存放的数据库对象(表、索引、簇等)会被存放到新表空间名下。

删除表空间
当某个表空间中的数据再也不须要时,或者新建立的表空间不符合要求时,能够考虑删除这个表空间。若要删除表空间,则须要用户具备DROP TABLESPACE权限。
在默认状况下,Oracle系统不采用Oracle Managed Files方式管理文件,这样删除表空间实际上仅是从数据字典和控制文件中将该表空间的有关信息清除掉,并无真正删除该表空间包含的全部物理文件。所以,要想完全删除表空间来释放磁盘空间,那么在执行删除表空间的命令以后,还须要手工删除该表空间包含的全部物理文件。
当Oracle系统采用Oracle Managed Files方式管理文件时,删除某个表空间后,Oracle系统将自动删除该表空间包含的全部物理文件。删除表空间须要使用DROP TABLESPACE命令,其语法格式以下:

DROP TABLESPACE tbs_name[INCLUDING CONTENTS] [CASCADE CONSTRAINTS]

参数说明以下:

  • tbs_name:表示要删除的表空间名称。
  • INCLUDING DONTENTS:表示删除表空间的同时删除表空间中的数据。若是不指定INCLUDING
    CONTENTS参数,而该表空间又存在数据时,则Oracle会提示错误。
  • CASCADE CONSTRAINTS:表示当删除当前表空间时也删除相关的完整性限制。完整性限制包括主键及惟一索引等。若是完整性存在,而没有CASCADE CONSTRAINTS参数,则Oracle会提示错误,而且不会删除该表空间。

删除表空间tbs_test_2及其包含的全部内容。

SQL> drop tablespace tbs_test_1
  2  including contents
  3  cascade constraints;

在上面的代码中,不但删除了表空间tbs_test_1,并且也删除了表空间中的数据(including contents)和完整性约束(cascade constraints)。

维护表空间中的数据文件
维护表空间中的数据文件主要包括向表空间中添加数据文件、从表空间中删除数据文件和对表空间中的数据文件进行自动扩展设置
1.向表空间中添加数据文件
当某个非自动扩展表空间的扩展能力不能知足新的扩展需求,数据库管理员就须要向表空间中添加新的数据文件(好比,添加一个可以自动扩展的表空间),以知足数据对象的扩展须要。下面来看一个向表空间添加新数据文件的例子。
向users表空间中添加一个新的数据文件users02.dbf,该文件支持自动扩展,扩展能力为每次扩展5m,而且该文件的最大空间不受限制

SQL> alter tablespace users add datafile 'e:\app\Administrator\oradata\orcl\users02.dbf'
  2  size 10m autoextend on next 5m maxsize unlimited;

2.从表空间中删除数据文件
在Oracle 11g R2之前的版本中,Oracle系统一直只容许增长数据文件到表空间,而不容许从表空间中删除数据文件。从Oracle 11g R2开始,容许从表空间中删除无数据的数据文件。要实现从表空间中删除数据文件,须要使用ALTER TABLESPACE…DROP DATAFILE语句
删除users表空间中的users02.dbf数据文件

SQL> alter tablespace users drop datafile 'e:\app\Administrator\oradata\orcl\users02.dbf';

3.对数据文件的自动扩展设置
Oracle数据库的数据文件能够设置成具备自动扩展的功能,当数据文件剩余的自由空间不足时,它会按照设定的扩展量自动扩展到指定的值。这样能够避免因为剩余表空间不足而致使数据对象需求空间扩展失败的现象。
可使用AUTOEXTEND ON命令使数据文件在使用中能根据需求自动扩展。用户能够经过如下4种方式设置数据文件的自动扩展功能。

  • 在CREATE DATABASE语句中设置。
  • 在ALTER DATABASE语句中设置。
  • 在CREATE TABLESPACE语句中设置。
  • 在ALTER TABLESPACE语句中设置。

    对于Oracle 数据库管理员来讲,主要是用后三种命令修改数据文件是否为自动扩展,由于数据库实例已经建立完成,因此再也不须要使用CREATE DATABASE命令。
    首先查询TBS_TEST_2表空间中的数据文件是否为自动扩展,若不是自动扩展,而后修改成自动扩展,扩展量为10m,而且最大扩展空间不受限制

SQL> col file_name for a50;
SQL> select file_name ,autoextensible from dba_data_files where tablespace_name = 'TBS_TEST_2';

FILE_NAME                                           AUT
------------------------------------------------------------------------------  ---
D:\ORACLEFILES\ORACLEDATA\DATAFILE2.DBF         NO

从上面的运行结果中能够看出,DATAFILE2.DBF数据文件不自动扩展(autoextensible属性值为NO),而后使用alter databas语句修改该数据文件为自动扩展。

SQL> alter database datafile 'D:\OracleFiles\OracleData\datafile2.dbf'
  2  autoextend on next 10m maxsize unlimited;

管理撤销表空间
撤销表空间,一般也称为UNDO表空间;UNDO表空间中的段也称为撤销段或UNDO段;撤销段中存放的数据就是“撤销信息”,这些“撤销信息”也称为撤销数据或UNDO数据,可见撤销段是最直接管理“撤销信息”的逻辑层,下面将对撤销段的几种做用进行讲解和分析。
使读写一致
在不一样的进程或用户模式下检索数据时,Oracle只能给用户提供被提交的数据,这样能够确保数据的一致性。例如,在SCOTT模式下,执行了UPDATE emp SET sal=5500 WHERE empno=7788语句,这样旧的数据记录会被存放到UNDO段中,而新数据则会存放到emp段,假定此时该数据还没有提交(好比没有执行commit命令,也没有退出SQL*Plus环境);而后用户在SYSTEM模式下执行SELECT sal FROM scott.emp WHERE empno=7788语句,此时用户将取得“旧的工资数据”,而不是新数据5500,而该数据正是从UNDO段中读取的。
能够回退事务
当执行修改(UPDATE)数据操做时,旧的数据(即UNDO数据)被存放到UNDO段,而新的数据则被存放到数据段中。若是在修改操做中事务提交出现错误,就须要回退事务,从而取消数据的更改。好比,当用户使用UPDATE语句修改员工的工资时,发现,本来打算修改某我的的工资,但因为误操做,而致使修改了全公司员工的工资(好比,没有使用where条件语句)。这样,用户就能够经过执行ROLLBACK语句来取消事务修改。当执行ROLLBACK语句时,Oracle会将UNDO段的UNDO数据(即旧的员工工资)所有写回到数据段中。
事务恢复
事务恢复是例程恢复的一部分,它是由Oracle服务器自动完成的,若是在数据库运行过程当中出现例程失败(如断电、内存故障等),那么当重启Oracle 服务器时,后台进程SMON会自动执行例程恢复。执行例程恢复时,Oracle会从新处理全部未提交的数据记录,回退未提交事务。
闪回操做
Oracle 11g新增了强大的闪回功能,其中,不少闪回技术都是基于UNDO段实现的,好比,闪回表,闪回事务查询,闪回版本查询等等。

撤销表空间的初始化参数
Oracle 11g能够经过设置初始化参数来控制UNDO表空间管理撤销数据,与UNDO表空间有关的参数有如下几种:
UNDO_TABLESPACE该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,经过配置该参数能够指定例程所要使用的UNDO表空间。
UNDO_MANAGEMENT该初始化参数用于指定UNDO数据的管理模式,若是为AUTO,则为自动撤销管理模式,若是为MANUAL,则为回滚段管理模式。须要注意的是,使用自动撤销管理模式时,若是没有配置初始化参数UNDO_TABLESPACE,Oracle会自动选择第一个可用的UNDO表空间存放UNDO数据;若是没有可用的UNDO表空间,Oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告。
UNDO_RETENTION该初始化参数用于控制UNDO数据的最大保留时间,默认为900秒,从9i版本开始,经过配置该初始化参数,能够指定UNDO数据的保留时间,从而也决定了基于UNDO数据的闪回操做可以闪回的最先时间点。

撤销表空间的基本操做
对撤销表空间的基本操做包括建立、修改、删除和切换等,下面分别进行介绍。
1.建立UNDO表空间
建立UNDO表空间须要使用CREATE UNDO TABLESPACE 语句,来看下面的例子。

---建立一个撤销表空间,并指定数据文件大小为100m
SQL> create undo tablespace undo_tbs_1
  2  datafile 'D:\OracleFiles\OracleData\undotbs1.dbf'
  3  size 3g;

在建立表空间时,须要注意如下两个方面:

  • UNDO表空间对应的数据文件大小一般由DML操做可能产生的最大数据量来肯定,一般该数据文件的大小至少应在1G以上;
  • 因为UNDO表空间只用于存放撤销数据,因此不要在UNDO表空间内创建任何数据对象(如,表、索引等)。

2.修改UNDO表空间
与修改普通的永久性表空间比较相似,修改UNDO表空间也使用ALTER TABLESPACE语句。当事务用尽了UNDO表空间后,可使用ALTER TABLESPACE…ADD DATAFILE语句添加新的数据文件;当UNDO表空间所在的磁盘填满时,可使用ALTER TABLESPACE…RENAME DATAFILE语句将数据文件移动到其它磁盘上;当数据库处于ARCHIVELOG模式时,可使用ALTER TABLESPACE…BEGIN BACKUP/END BACKUP语句备份UNDO表空间。

管理临时表空间
临时表空间是一个磁盘空间,主要用于内存排序区不够而必须将数据写到磁盘的那个逻辑区域,因为该空间在排序操做完成后能够由Oracle系统自动释放,因此也称做临时表空间。
临时表空间主要用于临时段,而临时段是由数据库根据须要建立、管理和删除的,这些临时段的生成一般与排序之类的操做有关,下面的几种操做常常会用到临时表空间。
- SELECT DISTINCT不重复检索
- UNION联合查询
- MINUS计算
- ANALYZE分析
- 链接两个没有索引的表

一般使用CREATE TEMPORARY TABLESPACE语句来建立临时表空间,-

--- 建立一个临时表空间,空间大小为300m
SQL> create temporary tablespace temp_01 tempfile 'D:\OracleFiles\tempfiles\temp_01.tpf' size 300m;

在临时表空间建立完毕以后,能够经过alter database命令修改默认的临时表空间为新建立的临时表空间,这样Oracle系统就会使用新建立的临时表空间来存放临时数据

------把新建立的临时表空间temp_01设置为系统默认的临时表空间
SQL> alter database default temporary tablespace temp_01;

临时表空间是用临时文件而不是数据文件来建立的。另外,临时表空间不须要备份。临时表空间中的数据的修改也不会被记录到重作日志当中去。
说明:关于临时表空间的其它操做,好比,重命名表空间、删除表空间,这些与永久性表空间的操做基本相同,这里再也不赘述。
查询临时表空间的信息
这里写图片描述

关于临时表空间组
在Oracle 11g中,能够建立多个临时表空间,而后把它们组成一个临时表空间组,这样,应用系统中的数据在排序时就可使用组里的多个临时表空间,在一个临时表空间组里至少有一个临时表空间,其最大个数没有限制,可是组的名字不能和其中某个临时表空间的名字相同。用户使用临时表空间组来管理临时数据具备如下做用:

  • 避免因大量的排序数据而致使单一临时表空间不足。
  • 当一个用户同时有多个会话时,可使得它们使用组中的不一样临时表空间。
  • 使并行的服务器在单节点上可以使用多个临时表空间。

用户能够在建立临时表空间的同时来建立临时表空间组,若是删除组中的所有临时表空间,那么该组也将消失。另外,用户也能够将一个临时表空间从一个组移动到另外一个组,或是向组里添加新的表空间,下面来看一下关于管理临时表空间的几种状况:
(1)建立临时表空间组
建立临时表空间组主要使用group子句

---建立一个临时表空间组,并向其中添加两个临时表空间
SQL> create temporary tablespace tp1 tempfile 'D:\OracleFiles\tempfiles\tp1.tpf' size 10m tablespace group group1;
SQL> create temporary tablespace tp2 tempfile 'D:\OracleFiles\tempfiles\tp2.tpf' size 20m tablespace group group1;

(2)转移临时表空间到另一个组
转移临时表空间到另一个组主要使用alter tablespace语句

--建立临时表空间组group3,将组group1中的临时表空间tp1转移到group3中
SQL> create temporary tablespace tp3 tempfile 'D:\OracleFiles\tempfiles\tp3.tpf' size 10m tablespace group group3;
SQL> alter tablespace tp1 tablespace group group3;

在将组group1中的临时表空间tp1转移到组group3中以后,用户能够经过查询dba_tablespace­groups数据字典来查看组group3中的临时表空间。

综合实例——在新建的表空间中建立数据表
(1)打开SQL*Plus,以system身份登陆。登陆成功后,在SQL*Plus中输入以下代码建立表空间

SQL> create tablespace test datafile 'E:\database\test_data.dbf' size 20M autoextend on next 5M;

(2)在新建的表空间中建立教师表,代码及运行结果以下:

SQL> create table teacher(
  2  teaid number primary key,
  3  teaname varchar2(10),
  4  teaage number,
  5  teasubject varchar2(20),
  6  teasex varchar(5))
  7  tablespace test
  8  /