Oracle学习(1)——BLOCK
时间:2010-09-25 来源:smallhonker
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中。
相关阅读 更多 +