一.前提:
1.须有CREATE TABLESPACE的权限
2.如果创建SYSAUX表空间,须有sysdba的权限
3.在创建tablespace之前,必须也有database
4.若database运行在automatic undo management mode,必须至少有一个UNDO tablespace在online状态
5.若database运行在manual undo management mode,必须至少有一个rollback segment在online状态
二.重要参数说明
1.TableSpace类型:Permanent,Undo和Temporary
Permanent Tablespace
一般我们创建给AP使用的都是Permanent Tablespace。里面物件的生命周期不会随着交易或者使用者的session结束而消失。
Undo Tablespace
Undo Tablespace是系统用的特殊的Tablespace,用来取代过去的rollback segement的机制,主要的功用是提供使用者修改资料未commit之前的read consistency的功能以及rollback交易的功能。也因为undo tablespace主要是取代过去的rollback segement的机制,所以不能存放其他种类的segement。 undo tablespace只能是local managed。
Temporary Tablespace
Temporary Tablespace也是系统用的特殊的Tablespace。当使用者需要做排序时,有时就会使用Temporary Tablespace,因此里面的Segement的生命周期都很短,可能交易结束或者User的Session结束就会消失。每个系统都必须要有一个预设的Temporary Tablespace(Default Temporary Tablespace),如果没有的话,忘了指定使用哪个Temporary Tablespace的使用者会以SYSTEM tablespace来当作Temporary Tablespace,这样就很糟糕。以下列出几个Temporary Tablespace的特性。
Temporary Tablespace是NOLOGGING模式,因此若资料库损毁,做Recovery不需要恢复Temporary Tablespace。
Temporary最好是使用Local managed Tablespace
若使用local managed模式,UNIFORM SIZE参数最好是Sort_Area_Size的参数,这样效能比较好。
Uniform size预设1024K,而Sort_area_size预设是512K
Temporary Tablespace不能使用local managed的AUTOALLOCATE参数。
2. bigfile and smallfile
bigfile : 只有一个datafile或者tempfile. 最多包含4 billion(2的32次幂)个blocks.最大大小可达128TB(若数据块大小为32K)或32TB(数据块大小为8K).
smallfile: 传统的空间类型,最多包含1022个datafiles或者tempfiles,最多包含4 million(2的22次幂)个blocks. 最大大小可达128GB(若数据块大小为32)?32GB(数据块大小为8K).
3.Bigfile Tablespaces的限制
只有一个datafile或者tempfile
不能为EXTENT MANAGEMENT DICTIONARY.
4.SYSAUX Tablespace的说明
必须标明EXTENT MANAGEMENT LOCAL and SEGMENT SPACE MANAGEMENT AUTO
不能为offline和TEMPORARY
5.DataFile和tempfile
必须标明DATAFILE or TEMPFILE
如果你事先设置了DB_CREATE_FILE_DEST参数,这个clause可以不用.
6.REUSE
REUSE表示文件是否被重用.即新的tablespace可以使用已有的文件,
若database使用Raw Device(裸设备),则reuse无意义
7.MINIMUM EXTENT
Only for a dictionary-managed tablespace,指出在表空间中范围的最小值。这个参数可以减小空间碎片,保证在表空间的范围是这个数值的整数倍。
8.BLOCKSIZE
这个参数可以设定一个不标准的块的大小。如果要设置这个参数,必须设置db_block_size,至少一个db_nk_block_size,并且声明的integer的值必须等于db_nk_block_size.
9.logging_clause
这个子句声明这个表空间上所有的用户对象的日志属性(缺省是logging),包括表,索引,分区,物化视图,物化视图上的索引,分区。
表空间级别的logging属性可以被对象的logging属性重写,即表空间中的对象可以有自己的loggging属性.
不能用在temporary or undo tablespace
10.FORCE LOGGING
使用这个子句指出表空间进入强制日志模式。此时,系统将记录表空间上对象的所有改变,除了临时段的改变。这个参数高于对象的nologging选项。
注意:设置这个参数数据库必须open并且处于读写模式。而且,在临时表空间和回滚表空间中不能使用这个选项。
11.DEFAULT storage_clause
声明缺省的参数for表空间的所有对象
不能用于临时表空间.
对dictionary-managed表空间,只能使用compress一个参数.
12.ONLINE | OFFLINE Clauses
不能用于临时表空间
13.extent_management_clause
这是最重要的子句,说明了表空间如何管理范围。一旦你声明了这个子句,只能通过移植的方式改变这些参数。
如果希望表空间本地管理的话,声明local选项。本地管理表空间是通过位图管理的。autoallocate说明表空间自动分配范围,用户不能指定范围的大小。只有9.0以上的版本具有这个功能。uniform说明表空间的范围的固定大小,缺省是1m。
不能将本地管理的数据库的system表空间设置成字典管理。
oracle公司推荐使用本地管理表空间。
如果没有设置extent_management_clause,oracle会给他设置一个默认值。如果初始化参数compatible小于9.0.0,那么系统创建字典管理表空间。如果大于9.0.0,那么按照如下设置:
如果没有指定default storage_clause,oracle创建一个自动分配的本地管理表空间。
否则,如果指定了mininum extent,那么oracle判断mininum extent 、initial、next是否相等,以及pctincrease是否=0.如果满足以上的条件,oracle创建一个本地管理表空间,extent size是initial.如果不满足以上条件,那么oracle将创建一个自动分配的本地管理表空间。
如果没有指定mininum extent。initial、那么oracle判断next是否相等,以及pctincrease是否=0。如果满足oracle创建一个本地管理表空间并指定uniform。否则oracle将创建一个自动分配的本地管理表空间。
注意:本地管理表空间只能存储永久对象。如果你声明了local,将不能声明default storage_clause,mininum extent、temporary.
Local Managed与Dictionary Managed最主要的分别,在于空间管理方式的不同。
Local managed的管理方式是让每个TableSpace自己利用bitmaps去管理他自己的空间,
而Dictionary Managed则是利用SYSTEM TableSpace的资料字典来做空间管理。
这两者最大的不同在于Local managed大大的改善了Oracle做空间管理
(例如:产生新的Exten或释放Extent...等)时,抢夺SYSTEM TableSpace资源的问题。
所以Oracle从8i以后已经朝Local managed的方向去走了,所以我们应该尽量使用Local managed的方式才对,
所以Dictionary managed的方式不多做介绍了。
Local managed tablespace
Local managed使用bitmaps做空间管理。
bitmaps中每个bit代表一个data block或者一堆相邻的data block(extent)
从10g开始,SYSTEM Tablespace预设使用local managed -->Oracle建议使用local managed的证据。
假如SYSTEM TableSpace是local managed,那么其他TableSpace必须是local managed。
若没指定使用local managed或者dictionary managed,则预设使用local managed。
使用local managed可以增进效能,因为减少了SYSTEM TableSpace的效能竞争。
使用local managed则不需要做空间缝合(loalescing),因为相邻的不同大小的extent,
辨识extent使用状态的bits也在一起,Oracle可以直接使用这些相邻的extent。不需要先进行缝合才可以使用。这也可以增进部份效能。
local managed的extent空间管理(Extent Management):AUTOALLOCATE与UNIFORM
AUTOALLOCATE与UNIFORM这两个参数,是用来设定Local managed的extent大小的参数。
AUTOALLOCATE是让Oracle自己来决定extent的大小;
而UNIFORM则是强制规定TableSpace中extent的为固定的大小。
通常若你明确的知道extent必须多大,才会使用UNIFORM,使用UNIFORM的好处是每个extent的大小都相同,
不会产生空间破碎的问题。
但是如果无法预知extent必须多大,使用AUTOALLOCATE会比较好,让Oracle自己决定使用extent的大小,可以比较符合实际的需求,
因此会比较节省空间,但是这可能会产生部分空间破碎的问题。使用AUTOEXTENT,Oracle会使用的extent大小为64k、1M、8M、64M。
根据我系统上使用的结果,99.95%的extent都是使用64k、只有少部分使用1M的extent,所以其实破碎的情况不严重,
使用AUTOALLOCATE在我的系统上其实就够用了。
想知道你的TableSpace所使用的Extent有几种,请用下列的语法:
Select bytes,count(*) from dba_extents where tablespace_name='your_tablespace_name' group by bytes
14.segment_management_clause
Local managed中的Segment的空间管理(Segment Space Management ):
AUTO与MANUAL
Tablespace中的Segment的空间管理上,可以设置的参数为AUTO与MANUAL。
MANUAL是使用我们熟悉的PCTUSED、FREELISTS、FREELIST GROUPS的方式来管理Segment中的data block;
而AUTO则是使用bitmaps来管理data block。使用AUTO来管理的话,以往create tablespace或create table时设定的storage的参数设定都不需要再设定了,
因为data block的管理已经是bitmaps了,不再是free list了。如果没有特别的需求话,使用AUTO会比使用MANUAL有更好的空间利用率,与效能上的提升。