序言
在Oracle 8i以前,Oracle使用字典管理表空间(Dictionary Managed Tablespace),对于使用数据字典来管理区的表空间,每当分配或回收区时Oracle 服务器将更新数据字典中的相应表,这是表空间缺省的空间管理方法。在Oracle 8.0 版和更早版本内这是唯一可用的方法。
从Oracle 8i开始,Oracle提供了一种新的表空间的管理方式,即本地管理表空间(Local Managed Tablespace)。使用LMT,Oracle通过在每个数据文件内都维护一个位图以了解该数据文件内块的空闲或使用状态,位图内的每一位对应一个块或者一组块在分配区或者释放区,以供再次使用时Oracle 服务器更改位图数值以显示块的新状态。
使用本地管理表空间(LMT),每次一个区间被分配或者释放(以便重用)时,Oracle就会更新位图信息来显示新的空间使用装空,这样就避免了因为在字典管理的空间分配期间需要的递归操作而导致的性能问题,而且简化空间分配,减少用户对数据字典的依赖(因为必要的信息被存储在文件头和位图块中了)。
使用本地管理表空间很少形成空间碎片,因此该空间中的对象很少有与空间有关的问题。另外需要注意的是,无论使用Oracle 8i数据库还是Oracle 9i数据库系统,都不能在创建数据库时将SYSTEM表空间创建为本地管理表空间(LMT),并且也永远不能将SYSTEM表空间转换成本地管理表空间(LMT)。
创建本地管理表空间的一些选项
在Oracle 9i数据库中,本地管理表空间(LMT)是默认的空间管理方式。要想创建本地管理表空间(LMT),只需要在CREATE TABLESPACE 语句的EXTENT MANAGEMENT 子句中指定LOCAL字句。创建LMT时,你可以选择使用AUTOALLOCATE 选项来使用Oracle 自动管理盘区,或者可以使用一个指定大小(UNIFORM SIZE字句) 的统一盘区来管理该表空间。如果省略UNIFORM SIZE选项,则默认选项是AUTOALLOCATE。
具体的语法如下:
在Create Tablespace语句的EXTENT MANAGEMENT 子句的LOCAL 选项指定表空间是本地管理的:
extent_management_clause :==
[ EXTENT MANAGEMENT
{ DICTIONARY | LOCAL
{ AUTOALLOCATE | UNIFORM [SIZE integer[K|M]] } } ]
(其中DICTIONARY 指定使用字典表来管理表空间这是缺省方法)
其中:
· LOCAL 指定通过位图来本地管理表空间(如果指定了LOCAL 则无法指定DEFAULT storage_clause MINIMUM EXTENT或者TEMPORARY)
· AUTOALLOCATE 指定表空间由系统管理,用户无法指定区大小
· UNIFORM 指定通过大小为SIZE 字节的统一区来管理表空间,使用K 或M 以千字节或者兆字节为单位来指定区大小
· SIZE 缺省值为1 兆字节
· EXTENT MANAGEMENT 子句可用于各种CREATE 命令中,对于非SYSTEM 的永久表空间可以在CREATE TABLESPACE 命令中指定EXTENT MANGEMENT LOCAL;对于临时表空间可以在CREATE TEMPORARY TABLESPACE 命令中指定EXTENT MANGEMENT LOCAL
例如,如果使用下面的语句,将会按照默认方式创建Oracle 自动管理盘区的本地管理表空间(LMT):
CREATE TABLESPACE LMTTEST DATAFILE 'D:/LMTTEST.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL; |
何时使用Oracle 自动管理盘(即,使用AUTOALLOCATE 选项)?
如果表空间中的EXTENT的尺寸是不一定的,即需要不同的盘区大小和拥有很多盘区的大小变动的对象,这时使用AUTOALLOCATE 是比较合理的选择。虽然有可能浪费了一些空间,但是由Oracle来管理空间的使用(空间分配和回收的工作),简化了用户空间的管理。
例如:
SQL> CREATE TABLESPACE LMTTEST 2 DATAFILE 'D:/LMTTEST.dbf' SIZE 5M 3 EXTENT MANAGEMENT LOCAL 4 AUTOALLOCATE;
表空间已创建。
SQL> |
何时使用统一盘区来管理表空间(即,使用UNIFORM SIZE字句)?
如果想要准确控制未用的空间,并且能够精确地预计为一个或更多对象要分配的空间和盘区的数目、大小等,那么使用UNIFORM 选项更合适,因为它确保在表空间中永远不会有一定数量的未用空间。UNIFORM SIZE的默认大小是1MB,此时,使用此方式创建数据文件时,数据文件的大小至少为1MB(位图空间加上一个块)。
例如,假设表空间块大小为4KB,统一盘区的大小为256K,那么位图中的每一位描述64个块(256/4):
SQL> CREATE TABLESPACE LMTTEST 2 DATAFILE 'D:/LMTTEST.dbf' SIZE 10M 3 EXTENT MANAGEMENT LOCAL 4 UNIFORM SIZE 256K;
表空间已创建。
SQL> |
综上,本地管理的表空间比字典式管理的表空间有如下优点:
? 本地管理避免了循环空间管理操作,而这种操作在字典式管理表空间中可能发生(当消耗或释放某个区的空间,导致另一个消耗或释放回退段或数据字典表内空间的操作)
? 因为本地管理的表空间不记录数据字典表中的空闲空间,从而减少了对这些表的争用
? 区的本地管理自动跟踪邻近的空闲空间,因而无须合并空闲区
? 本地管理的区大小可以由系统自动决定,作为选择本地管理的表空间内的所有的区都可以有相同大小
? 转换为区的位图不会生成回退信息,因为它们不更新数据字典中的表(除表空间定额信息等特殊情况外)