Oracle的逻辑结构(表空间、段、区间、块)——区间

原创于2009年02月12日,2009年10月22日迁移至此。


Oracle 的逻辑结构 ( 表空间、段、区间、块 ) ——区间

 

区间是数据库 存储空间分配的逻辑单位,由一些连续数据块组成。一个或多个区间又构成了一个段。当现有的空间部分被完全使用的时候, Oracle 就会为段分配一个新的区间。

An extent is a logical unit of database storage space allocation made up of a number of contiguous data blocks. One or more extents in turn make up a segment. When the existing space in a segment is completely used, Oracle allocates a new extent for the segment.

区间的分配

当创建一个表的时候, Oracle 会分配一定数目的数据块的初始区间给相应的表的数据段。尽管还没有插入行数据,对应初始区间的 Oracle 数据块仍然为表记录保留了这些空间。

如果一个段初始区间的数据块已满,并且需要更多的空间来满足新数据, Oracle 将自动为该段分配增量区间。一个增量区间大小等同或者大于该段内的先前的区间大小。

出于维护目的,每个数据段的第一个数据块都包含了该段的区间目录。

区间大小和数量

存储参数适用于各种类型的数据段。它控制着 Oracle 如何给某一数据段分配可用得数据库空间。例如,你可以决定为一个数据段保留多少初始空间,也可以通过指定存储参数限制区间分配数量。如果没有指定表的存储参数,那么它将使用表空间的缺省存储参数。

Oracle8i 之前的版本,所有表空间都是基于字典管理 。字典管理表空间依赖于数据字典表来跟踪空间利用率。从 Oracle8i 开始,你可以创建本地管理表空间方式,本地管理表空间是通过位图(而不是数据字典表)来跟踪已用和可用空间。因为本地管理表空间的更好的性能和更易于管理特点,如果未指定区间管理类型,那么非系统表空间将缺省采用本地管理方式。

对于系统管理区间而言,你可以指定初始段的大小,然后由 Oracle 决定新增区间的大小,最小区间大小为 64k

对于 uniform 区间,你可以指定区间大小或者使用 1M 的缺省大小。

Oracle 之所以推出了这种新的表空间管理方法,让我们来看一下这种表空间组织方法的优点:

1. 本地化管理的表空间避免了递归的空间管理操作。而这种情况在数据字典管理的表空间是经常出现的,当表空间里的区间的使用状况发生改变时,数据字典的表的信息发生改变,从而同时也使用了在系统表空间里的回滚段。

2. 本地化管理的表空间避免了在数据字典相应表里面写入空闲空间、已使用空间的信息,从而减少了数据字典表的竞争,提高了空间管理的并发性

3. 区间的本地化管理会自动跟踪表空间里的空闲块,减少了手工合并自由空间的需要。

4. 表空间里的区间的大小可以选择由 Oracle 系统来决定,或者由数据库管理员指定一个统一的大小,避免了字典表空间一直头疼的碎片问题。

5. 从由数据字典来管理空闲块改为由数据文件的头部记录来管理空闲块,这样避免产生回滚信息,不再使用系统表空间里的回滚段。因为由数据字典来管理的话,它会把相关信息记在数据字典的表里,从而产生回滚信息。

如何分配区间

Oracle 使用不同的算法来分配区间,主要取决于他们采用本地管理方式或字典管理方式。

对于本地管理表空间, Oralce 会首先确定表空间的相应数据文件,然后搜索数据文件的位图来寻找所需数量的相邻空闲数据块,从而搜寻可用空间以分配给一个新的区间。如果数据文件没有足够的可用相邻空间, Oracle 将会寻找另外的数据文件。

何时释放区间

一般情况下,除非你 drop 该模式对象 ( 例如 drop table 或者 drop cluster 语句 ) ,否则一个段的区间是不会退给该表空间的。当然也有如下例外情况:

l  表或簇的所有者,或者拥有 delete any 权限的用户通过 truncate …drop storage 语句来清除该表或簇。

l  系统管理使用 Alter table table_name deallocate unused; 语句来释放未使用的区间。

l  假如指定了优化大小参数, Oracle 会定期的释放回滚段中的区间。

一旦区间可用, Oracle 会修改数据文件位图 ( 对本地管理表空间而言 ) 或者更新数据字典 ( 对字典管理表空间而言 ) ,以正确显示可用空间的恢复区间。这些释放的区间或块中任何数据均不可再访问。

非簇表区间

只要该表存在或者甚至 truncate 该表,分配给该数据段的数据块依然为该表保留。假如有足够的空间 Oracle 就会插入新行到数据块中。即使 delete 表中所有行, Oracle 也不会回收这些数据块。

簇表区间

簇表存储为簇而创建的数据段的信息,因此当 drop 簇中的一个表时,数据段依然为簇中其他表保留,区间也不会被回收。你可以通过 truncate clusters 来释放区间。

物化视图和相应的日志区间

其回收区间行为和表和簇是一样的

索引区间

分配给索引段的所有区间和索引存在的周期是一致的,除非 drop 该索引或者相关的表和簇, Oracle 才会回收该区间

临时段区间

当完成执行任务后, Oracle 会自动释放相应的段的区间

回滚段区间

如果回滚段超过理想状态大小, Oracle 会自动回收回滚段中的区间。

 

字典管理表空间

Oracle8i 后已不推荐使用,所以略

本地管理表空间

Oracle8i 之后的版本中, Oracle 推荐采用本地化管理的表空间。所谓本地化管理,就是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个区的使用状况。每当一个区被使用,或者 被释放以供重新使用时, Oracle 都会更新数据文件头部的这个记录,反映这个变化。

本地化管理的表空间的创建过程:

   语法: CREATE TABLESPACE 表空间名字

           DATAFILE ’ 数据文件详细信息

           [EXTENT MANAGEMENT { LOCAL

           {AUTOALLOCATE | UNIFORM. [SIZE INTETER [K|M] ] } } ]

关键字 EXTENT MANAGEMENT LOCAL 指定这是一个本地化管理的表空间。对于系统表空间,只能在创建数据库的时候指定 EXTENT MANGEMENT LOCAL ,因为它是数据库创建时建立的第一个表空间。

更细的管理方式:是 AUTOALLOCATE 还是 UNIFORM.

若为 AUTOALLOCATE ,则表明让 Oracle 来决定区块的使用办法;

若选择 UNIFORM ,则还可以详细指定每个区块的大 小,若不加指定,则为每个区使用 1M 大小。  

-- 创建 UNIFORM 表空间

CREATE SMALLFILE TABLESPACE "UNIFORM"

DATAFILE 'F:/OracleForVista/product/10.2.0/oradata/inxite/UNIFORM.DB' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 200M

LOGGING EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO

UNIFORM. SIZE 40K;

-- 创建 AUTOALLOCATE 表空间

CREATE SMALLFILE TABLESPACE "AUTOALLOCATE"

DATAFILE 'F:/OracleForVista/product/10.2.0/oradata/inxite/AUTOALLOCATE.DB' SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 200M

LOGGING EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO

AUTOALLOCATE;

-- UNIFORM 上以缺省方式创建表

CREATE TABLE TESTUNIFORMDEFAULT

 (NAME VARCHAR2(4000))

TABLESPACE UNIFORM;

-- UNIFORM 上以指定存储参数方式创建表

CREATE TABLE TESTUNIFORMWITHSTORAGE

(NAME VARCHAR2(4000)) TABLESPACE UNIFORM.

STORAGE (INITIAL 64K NEXT 32K MINEXTENTS 1 MAXEXTENTS UNLIMITED);

-- AUTOALLOCATE 上以缺省方式创建表

CREATE TABLE TESTAUTOALLOCATEDEFAULT

(NAME VARCHAR2(4000))

TABLESPACE AUTOALLOCATE;

-- AUTOALLOCATE 上以指定存储参数方式创建表

CREATE TABLE TESTAUTOALLOCATEWITHSTORAGE

(NAME VARCHAR2(4000))

TABLESPACE AUTOALLOCATE

STORAGE (INITIAL 64K NEXT 32K MINEXTENTS 1 MAXEXTENTS UNLIMITED);

 

SELECT SEGMENT_NAME,TABLESPACE_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BYTES,BLOCKS,RELATIVE_FNO

FROM DBA_EXTENTS

WHERE SEGMENT_NAME IN ('TESTUNIFORMDEFAULT','TESTUNIFORMWITHSTORAGE','TESTAUTOALLOCATEDEFAULT','TESTAUTOALLOCATEWITHSTORAGE')

ORDER BY SEGMENT_NAME

从图中可以看出 'TESTUNIFORMWITHSTORAGE' 尽管我们分配了初始 64k 大小的区间,但是实际上是以 uniform 整数倍的方式来进行区间初始分配的,即系统自动分配了 2 40k 的区间。关于新增区间的分配在 uniform 方式下, oracle 以标准的 uniform 大小来分配,而不是依据该表存储参数的设置。

SELECT SEGMENT_NAME,TABLESPACE_NAME,HEADER_FILE,HEADER_BLOCK,BYTES,BLOCKS,EXTENTS,INITIAL_EXTENT,NEXT_EXTENT,RELATIVE_FNO

FROM DBA_SEGMENTS

WHERE SEGMENT_NAME IN ('TESTUNIFORMDEFAULT','TESTUNIFORMWITHSTORAGE','TESTAUTOALLOCATEDEFAULT','TESTAUTOALLOCATEWITHSTORAGE')

ORDER BY SEGMENT_NAME

 

关于 Oracle AUTOALLOCATE 方式下如何分配区间大小 参见《关于 Oracle 的高水平线》

http://space.itpub.net/6517/viewspace-536267
)j]#E hz g)Vm6517

关于 Oracle 区间的几个深度讨论帖子和文章

一个 internal 的问题: Oracle 的一个 extent 中的 block 在物理存储上是连续的吗?

http://www.itpub.net/viewthread.php?tid=183196&extra=&highlight=extent&page=1

oracle concept (10g r2) 第二章 Data Blocks, Extents, and Segments 的几个问题

http://www.itpub.net/viewthread.php?tid=515368

听说 DROP TABLE 的时候, Extents 要被回收。而 Trunate table 没有 Extents 要被回收

http://www.itpub.net/viewthread.php?tid=514580&extra=&page=1

Oracle ASSM 三级位图块结构

http://www.eygle.com/archives/2007/07/oracle_assm_level3_bmb.html

倾力大奉献—— ASSM 内部存储研究大揭密

http://www.itpub.net/152489.html

 

呵呵,只能说技术无止境,不懂的东西太多了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python与大数据分析

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值