BLOCK
BLOCK是
ORACLE下I/O的最小单位(换句话说,一次读出的数据至少是一个BLOCk)。
ORACLE的
BLOCk是由一个或多个OS BLOCk组成的。
ORACLE的
BLOCK是在创建TABLESPACE的时候就划分好的,之后分配使用。
ORACLE的初始化参数
DB_BLOCK_SIZE就是指定BLOCK大小的。
BLOCK的结构:
HEADER, FREE SPACE , DATA SPACE。
HEADER部分和
DATA SPACE从BLOCK的两头向中间扩展,
中间未用的部分就是
FREE SPACE。
有
4个参数控制着BLOCK的分配:INITTRANS, MAXTRANS, PCTFREE, PCTUSED。
描述如下:
BLOCK下包含数据允许最大的操作事务个数取决于
BLOCK某种空间(
TRANSACTION SLOT)的分配。
允许的事务越多,需要分配越多的
TRANS SLOT。
INITTRANS和
MAXTRANS就是规定这个TRANSACTION SLOT的。
PCTFREE和
PCTUSED是规定DATA SPACE和FREE SPACE之间关系的:
当一个空的
BLOCK开始写入数据后,DATA SPACE部分越来越大,同时,
FREE SPACE越来越小。当数据写入到一定程度时,
FREE SPACE占全部空间等于
PCTFREE时,这个BLOCK就不能再写入新的记录了。
剩下的这部分
(PCTFREE*DB_BLOCK_SIZE)空间用于给现有记录
update使用。后续的insert会导致从FREE BLOCK列表中拿另外一个BLOCK完成。当
BLOCK中记录通过delete时,BLOCK的DATA SPACE逐渐减少。
如果
BLOCK此时是一个FULL BLOCK,当
DATA SPACE降低置DB_BLOCK_SIZE*PCTUSED后,
ORACLE就认为这个
BLOCK是个FREE的BLOCK,就会放入FREE LIST
,可以继续插入数据了。可见,
PCTFREE和PCTUSED是两个水位线,用来限制
FREE、USED两个空间分隔线的位置的。
有两种
BLOCK的空间管理模式:AUTO和MANUL。
使用前者,
ORACEL会自动管理INITTRANS, MAXTRANS, PCTFREE, PCTUSED
这几个参数。
如下是创建一个
AUTO管理的TABLESPACE:
CREATE TABLESPACE data02
DATAFILE '/u01/oradata/data02.dbf' SIZE 5M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K
SEGMENT SPACE MANAGEMENT AUTO;
———————————————————————————————————————————————
区
extent
EXTENTS是若干连续的
BLOCKS,ORACLE每次给SEGMENT扩空间的时候,是以
EXTENTS为单位的。
在建
TABLE/INDEX时几个参数决定了EXTENTS的分配特性:
INITIAL EXTENT(单位:
K)、NEXT EXTENTS(单位:K)、PCT INCREASE、
MIN EXTENTS(单位:个
)、MAX EXTENTS(单位:个)。
基本过程是这样:当
SEGMENT创建时,分配的第一个EXTENTS
大小为
INITIAL EXTENT参数指定的大小。
如果
SEGMENT的空间不够,会分配第2个、第3个...EXTENTS。
第
2个EXTENT的大小为NEXT EXTENTS,
第
3个的大小为NEXT EXTENTS*(1+PCT INCREASE),
每次增加
PCT INCREASE,以此类推。
每个
TABLESPACE都有一个FREE EXTENTS LIST。
当需要新的
EXTENTS时,ORACLE会从这个LIST中取一个FREE EXTENT分配给需要的
SEGMENT。
当
SEGMENT释放空间时,空闲的EXTENTS会加入到这个LIST中以便后续使用。
段
segment
CREATE TABLE/INDEX
的
STORAGE字句,用来指定存储特性。如果没有指定,按照
TABLESPACE的STORAGE属性来,如果
TABLESPACE也没有指定STORAGE属性,则按照ORACLE的默认值来。
通常,一个
TABLE对应一个SEGMENT(PARTITION的除外)。
一个
SEGMENT只能在一个TABLESPACE内部。
对于
PARTITIONED表每个PARTITION占一个SEGMENT,每个
SEGMENT可以在不同的TABLESPACE中。