{
CREATE TABLESPACE RMANXL_DATA DATAFILE
'+DAT1_ASM' SIZE 240M AUTOEXTEND ON NEXT 10M MAXSIZE 1900M
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
}
表空间是ORACLE数据库最高层次的逻辑存储结构,保存段、区、块,由一个或多个数据文件组成。
块的存储管理
块是ORACLE存储结构的最小单位。块大小分为标准数据块和非标准数据块
标准数据块由DB_BLOCK_SIZE设定,创建数据库时设定的,创建完数据库后不能修改。
非标准块可以有4种,由初始化参数DB_nk_CACHE_SIZE设置,可在数据库创建后使用。
数据块的管理方法分为:
1、自动管理方式 如创建表空间时设置为本地管理方式,并且将段的存储空间方式设置为AUTO,该表空间的所有块均采用自动管理方式。系统默认值。
2、手工管理方式 是传统的管理方式,主要通过PCTFREE和PCTUSED两个存储参数控制可用存储区的大小,避免行迁移现象的发生。这两个参数可在创建表空间时设置,也可在数据库的模式对象(表,索引)中设置。模式对象中设置的优先级比表空间的要高。如表和索引中没有设置,则按表空间的设置,如表空间也没设置,则按自动管理方式管理块。
区的存储管理
区是ORACLE进行存储空间分配的最小单位。是由一系列物理上连续的数据块组成的逻辑存储结构。段中第一个区叫初始区,随后分配的区叫后续区。当段中所有的空间使用完后,ORACLE自动为该段分配一个新的区。
根据表空间的管理方法不同,区的分配方法也不同。
(1)本地管理方式下的区的分配方法。
自动分配和统一分配
自动分配由ORACLE自动确定段中初始区大小,默认值为64K,并根据存储要求自动分配优化大小的后续区。
统一分配由ORACLE自动分配具有统一大小的初始区和后续区。
CREATE TABLESPACE lmtbsb
DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;
(2)字典管理方式下的区的分配方法。
根据存储子句STORAGE中的存储参数分配新的区。
storage (
initial integer [K|M]
next integer [K|M]
minextents integer
maxextents {integer | unlimited}
pctincrease integer
)
如果使用了DEFAULT STORAGE子句,至少需要在其中设置一个存储参数。
INITIAL。缺少5个数据块的大小。如该值不是数据块大小的整数倍,系统自动确定舍入到数据块大小的整数倍。
PCTINCREASE。缺少为50。回滚段不能指定此参数,其值总是0。
存储子句可以在3处设置:
一是ORACLE缺省值
二是创建表空间时为表空间设置的存储参数
三是创建模式对象(如表、索引)时为该模式对象设置的存储参数。
这三个地方都可能对区的分配产生影响,有优先级
创建模式对象中的存储子句最高,表空间次之,ORACLE缺省值最低。
也就是说创建模式对象时没有指定存储参数,按表空间的存储子句进行,如表空间没有指定,按ORACLE缺省值来。
区分配管理在创建表空间时确定,建完后,不允许更改
extent management
{dictionary |
local autoallocate | uniform [size integer K|M] }
autoallocate 本地管理方式下的区自动分配
uniform 本地管理方式下的区统一分配
一个段只属于一个模式对象,如表、索引
创建一个模式对象时,ORACLE为这个对象创建一个段,在这个段中保存这个对象的所有数据,当这个段数据增加时,为这个段分配新的区存储数据。段中至少有一个初始区。
段有以下类型:
数据段 用来存储表和簇的数据
索引段
临时段 暂存SQL语句的临时数据,以及临时表和临时表的索引等。
回退段
段管理主要有两种方式:
自动管理方式。 采用位图管理段的存储空间
手工管理方式。 采用FREELIST管理段的存储空间
段的管理方式只有在创建表空间时设置,完成后不好更改
在ORACLE9I中,缺省状态为自动管理方式
segment space management { man l | auto}
表空间
表空间的管理方式主要有两种:
字典管理 在数据字典中管理表空间的空间分配
本地管理 在每个数据文件中使用位图来管理空间的分配,表空间中所有区的分配信息都保存在该表空间对应的数据文件的头部。
oracle 8i以前只有字典管理,之后引入本地管理
本地管理的表空间的优点:
速度快,存储空间的分配和回收只是简单地改变数据文件中的位图,而不像字典管理方式还需要修改数据库。
改善了存储管理的性能。某些在字典管理方式下的存储分配有时会产生递归操作,从而影响了系统的性能,使用本地管理方式不会产生递归操作。而且无碎片,更易于DBA维护。
段的管理方式是在建立表空间时确定的,一经确定不能改变。
区的管理方式与表空间的管理方式密切相关:
字典方式下:ORACLE根据存储子句分配区,这些参数可以在创建表空间后修改。参数设置不恰当,表空间中会有空闲区碎片,需要DBA手工执行碎片合并,降低性能,增加DBA工作。
本地方式下:由ORACLE自动分配区,这种方式一旦确定不能修改。ORACLE9I 建议采用方式。
表空间的类型:
System Tablespace 系统表空间:主要包括数据字典、所有PL/SQL程序单元以及所有模式对象的定义。
Temp Tablespace 临时表空间:用于暂存一些复杂SQL查询语句运行时产生的临时数据。在执行SQL语句中,如临时数据量大,SQL工作区放不下,将利用临时表空间暂存部分临时数据。
Undo Tablespace :由ORACLE自动分配管理,每一个实例只能使用一个UNDO表空间
User Tablespace 用户表空间:用来保存用户数据
##########################################
字典管理表空间-DMT 本地管理表空间-LMT
字典管理表空间(Dictionary-Managed Tablespace简称DMT),8i以前包括以后都还可以使用的一种表空间管理模式,通过数据字典管理表空间的空间使用。
Oracle使用两个字典来记录Extents的使用情况:SYS.FET$记录空闲的Extents,SYS.UET$记录使用的Extents。在分配和释放分区时,都要修改者两个字典。属于DML操作,存在竞争,每个动作都是一个事务,会产生UNDO记录。需要周期性进行合并操作。效率低下
本地管理表空间(Locally Managed Tablespace简称LMT),8i以后出现的一种新的表空间的管理模式,通过位图来管理表空间的空间使用。
通过数据头文件中的一个位图来记录文件中表空间的使用情况,每个BIT代表数据区,通过改变bit值来表示Extents的分配使用或释放,不属于DML操作,也不会产生UNDO记录,可以自动跟踪连续的空闲空间。带来的优势:不需要使用字典SYS.FET$和SYS.UET$上的递归SQL调用;减少数据字典的竞争;不会产生UNDO记录;不再需要周期性合并操作。
例:创建了一个本地管理的表空间,区间统一大小分配为64K
SQL> create tablespace leonarding
datafile '/ora01/oem/ leonarding 01.dbf' size 100m
extent management localuniform. size 64k;
本地管理tablespace(LMT)――LMT是通过把EXTENT MANAGEMENT LOCAL子句添加到tablespace的定义句法而实现的。和原来由字典管理的tablespace(DMT)不同,LMT会将扩展管理自动化,并保持Oracle DBA不会被用来指定管理扩展大小的NEXT存储参数。这个原则唯一的例外是在NEXT和MINEXTENTS一起用在表格创建的时候。
自动段空间管理(ASSM)――ASSM的tablespace是通过将SEGMENT SPACE MANAGEMENT AUTO子句添加到tablespace的定义句法里而实现的。通过使用位图freelist取代传统单向的链接列表freelist,ASSM的tablespace会将freelist的管理自动化,并取消为独立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存储参数的能力。
自动段空间管理(ASSM)
更多精彩内容:http://www.bianceng.cn/database/Oracle/
在920以前,表的剩余空间的管理与分配都是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起段头的争用与空间的浪费(其实这一点并不明显),最主要的还是因为需要DBA花费大量的精力去管理这些争用并监控表的空间利用。
自动段空间管理(ASSM),它首次出现在Oracle920里。有了ASSM,连接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,ASSM表空间上创建的段还有另外一个称呼叫Bitmap Managed Segments(BMB段)
Create tablespaceleonarding
datafile '/ora01/oem/leonarding01.dbf '
size 10m
EXTENT MANAGEMENT LOCAL-- Turn on LMT
SEGMENT SPACE MANAGEMENT AUTO-- Turn on ASSM;
一旦你定义好了tablespace,那么表和索引就能够使用各种方法很容易地被移动到新的tablespace里,带有ASSM的本地管理tablespace会略掉任何为PCTUSED、NEXT和FREELISTS所指定的值。
当表格或者索引被分配到这个tablespace以后,用于独立对象的PCTUSED的值会被忽略,而Oracle9i会使用位图数组来自动地管理tablespace里表格和索引的freelist。对于在LMT的tablespace内部创建的表格和索引而言,这个NEXT扩展子句是过时的,因为由本地管理的tablespace会管理它们。但是,INITIAL参数仍然是需要的,因为Oracle不可能提前知道初始表格加载的大小。对于ASSM而言,INITIAL最小的值是三个块。
新的管理机制用位图来跟踪或管理每个分配到对象的块,每个块有多少剩余空间根据位图的状态来确定,如>75%,50%-75%,25%-50%和<25%,也就是说位图其实采用了四个状态位来代替以前的pctused,什么时候该利用该数据块则由设定的pctfree来确定。
使用ASSM的一个巨大优势是,位图freelist肯定能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle9i以前的版本里曾是一个严重的问题。
缓冲区不再忙等待
在没有多个freelist的时候,每个Oracle表格和索引在表格的头部都曾有一个数据块,用来管理对象所使用的剩余区块,并为任何SQL插入声明所创建的新数据行提供数据块。当数据缓冲内的数据块由于被另一个DML事务处理锁定而无法使用的时候,缓冲区忙等待就会发生。当你需要将多个任务插入到同一个表格里的时候,这些任务就被强制等待,而同时Oracle会在同时分派剩余的区块,一次一个。
有了ASSM之后,Oracle宣称显著地提高了DML并发操作的性能,因为(同一个)位图的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。根据Oracle的测试结果,使用位图freelist会消除所有分段头部(对资源)的争夺,还能获得超快的并发插入操作
ASSM的局限性
尽管ASSM显示出了令人激动的特性并能够简化Oracle DBA的工作,但是Oracle9i的位图分段管理还是有一些局限性的:
1.一旦DBA被分配之后,它就无法控制tablespace内部的独立表格和索引的存储行为。
2.大型对象不能够使用ASSM,而且必须为包含有LOB数据类型的表格创建分离的tablespace。
3.你不能够使用ASSM创建临时的tablespace。这是由排序时临时分段的短暂特性所决定的。
4.只有本地管理的tablespace才能够使用位图分段管理。
5.使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的时候可能会出现性能上的问题。