Oracle的存储分为四个层次,Block、Extent、Segment和Tablespace。Oracle分配空间到Segment时,是将一组连续的Block添加到Segment,这组连续的Block称作一个Extent。
对于已经分配和还未分配的Extent的元数据可能存放在数据字典中(字典管理表空间),也可能存放在tablespace header中(本地管理表空间)。
可以通过以下语句来查看当前的表空间是本地管理还是字典管理:
select tablespace_name, extent_management, allocation_type from dba_tablespaces;
SYSTEM LOCAL SYSTEM
UNDOTBS1 LOCAL SYSTEM
SYSAUX LOCAL SYSTEM
TEMP LOCAL UNIFORM
USERS LOCAL SYSTEM
TEST LOCAL UNIFORM
字典管理表空间(DMT)
Oracle使用SYS.FET$表来记录空闲空间,使用SYS.UET$表来记录已经使用过的空间。当从表空间分配新的Extent时,必须先获得space transaction(ST) enqueue latch后才能插入或删除SYS.FET$和SYS.UET$表。在特定的时间内,只有一个进程能获得ST enqueue,这通常会引起竞争和等待。
可以使用下列语句来创建一个DMT
CREATE TABLESPACE ts1 DATAFILE '/oradata/ts1_01.dbf' SIZE 50M
EXTENT MANAGEMENT DICTIONARY
DEFAULT STORAGE ( INITIAL 50K NEXT 50K MINEXTENTS 2 MAXEXTENTS 50 PCTINCREASE 0);
DEFAULT STROAGE:该选项只对DMT有效。使用它可以指定在该DMT中创建的所有对象是否压缩(COMPRESS/NOCOMPRESS)及其默认参数。
MINIMUM EXTENT:指定extent的最小大小。
TEMPORARY:创建临时表空间。创建临时表空间有两种语法:CREATE TEMPORARY TABLESPACES TEMPFILE和CREATE TABLESPACE TEMPORARY。最好CREATE TEMPORARY TABLESPACES TEMPFILE来创建临时表空间,使用此方法创建的表空间只能是LMT。
如果你想创建DMT临时表空间可以使用CREATE TABLESPACE TEMPORARY。使用CREATE TEMPORARY TABLESPACES TEMPFILE创建临时表空间,不能使用AUTOALLOCATE,默认为UNIFORM。
本地管理表空间(LMT)
使用LMT,每个表空间使用表空间数据文件中的一个bitmap结构来管理空闲和已使用的空间的元数据信息。每一bit对应一个数据库block或一组blcok。可以通过下面任一语句建立一个LMT
CREATE TABLESPACE ts2 DATAFILE '/oradata/ts2_01.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
CREATE TABLESPACE ts3 DATAFILE '/oradata/ts3_01.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;
AUTOALLOCATE:使用AUTOALLOCATE,则extent的大小是系统管理的,Oracle在分配下一个extent时,会选择一个最佳的extent大小。extent大小包含从64KB到1MB、8MB一直到64MB,随着segment的增长oracle会选择更大的extent。
UNIFORM:使用UNIFORM指定extent大小,则Oracle会根据此数字创建下一个extent。默认值是1M。LMT表空间中创建object时,不能覆盖该uniform extent size。
本地管理表空间的好处:
----不需要使用recursive sql访问UET$和FET$
----消除了对于UET$和FET$的竞争(single ST enqueue)
----不用定期连接空闲空间,LMT会自动跟踪相邻的空闲空间。
----使用LMT时,分配extent只是改变segment header中的bitmap structure,不会产生回滚信息。