数据库的逻辑结构包括:数据块,区,段
oracle
数据块是oracle数据库的存储基础,由磁盘空间的若干字节组成,数据块是oracle的最小逻辑单元可以定义数据块为2k,4k,8k,16k,32k甚至更大,默认的oracle数据块为8k,我们通常称为oracle块,当然正常情况下oracle数据块应该是os块的整数倍,和标准块不同的是非标准块,在oracle9i之后支持同一个数据库中
同时使用标准块和非标准块。
oracle
的数据块是设置在初始化参数文件中的(init.ora)中的db_block_size中设置,块是处理update,insert,select数据事物的最小单元。当用户从表中选择数据的时候,将在oracle块中读取或者存取数据,意思就是说,os每次进行io的时候,都是以os块为单位,oracle每次io的时候,是以oracle块为单位。
oracle总结为以下几点:
最小的io单元。
包含一个或者多个os块。
db_block_size。
数据块创建时设置,数据库创建以后不能更改。
Oracle数据块的大小设置意见:
1、 如果行较小且访问随机,则选择小的块尺寸
2、 如果行小且访问连续的,或者有较大的行,则选择较大尺寸的块。
就是说看我们的业务系统
数据块的基本组成:
快结构的说明:
块头:存放一些基本的信息,如物理位置,块所属的段类型(数据段,索引段,回滚段)。
表目录:如果块中存储的数据为表数据,则表目录中保存这个表的相关信息
行目录:如果块中存储的数据为表数据,则行目录中保存数据行的相关信息
块头,行目录和表目录组成了块的头部信息(overhead),这部分不存数据库中的实际数据,而是用来记录该块的逻辑结构,而且这部分占用的空间不是固定的,一般在84~107k字节之间。
行记录:真正存放数据的区域,这部分空间已经被使用。
空闲空间:未使用的区域,用于新行的插入和已经存在行的更行(这里有个概念行迁移:就是当update操作时,块中空闲的空间不够保存修改的数据,那么记录就将保存到另一个拥有足够空间的块中,而只在原块上保留一条指向新块的rowid,这就是行迁移row
migration)
2:自由空间
空闲空间的使用:
Insert 的时候 块的自由空间会减少
udate的时候 块的自由空间也会减少
当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候,Oracle会释放出一部分自由空间。释放出的自由空间并不一定是连续的,常情况下,Oracle不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。只有当用户进行数据插入(INSERT)或者更新(UPDATE)操作,却找不到连续的自由空间的时候,Oracle才会合并数据块中不连续的自由空间。
3,空闲空间的管理:
对于块中的自由空间,Oracle 提供两种管理方式:自动管理和手动管理。
行链接和行迁移(Row Chaining and Migrating)
行链接(Row
Chaining):如果我们往数据库中插入(INSERT)一行数据,这行数据很大,以至于一个数据块存不下一整行,Oracle就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(Row
Chaining)。
如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。
行迁移(Row
Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。行迁移的原理如下图所示:
无论是行链接还是行迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执行更多的I/O。而且是成倍加大i/o。
1):Oracle
使用位图来管理和跟踪数据块,这种快的管理块中自由空间的方式叫做"自动管理“
自动管理有下面的好处:
※易于使用
※更好的利用空间
※可以对空间进行实时调整
2):块中自由空间的手动管理(手动管理比较复杂)
用户可以通过PCTFREE和PCTUSED来调整块中空间的使用,这种管理方式叫做手动管理。手动管理比较麻烦会造成快中空间的浪费。
PCTFREE参数用于指定块中必须保留的最小空闲空间百分例。之所以要预留这样的空间,是因为UPDATE时,需要这些空间。如果UPDATE时,没有空余空间,Oracle就会分配一个新的块,这会产生行迁移(Row
Migrating)。
PCTUSED也是用于设置一个百分比,当块中已使用的空间的比例小于这个百分比的时候,这个块才被标识为有效状态。只有有效的块才被允许插入数据。
三、基本实验
下面我们来分析一下块:
dump说明:
创建表空间和测试表:
create tablespace testblock datafile
'/opt/app/oracle/oradata/testblock01.dbf' size
100M;
create table testblock ( id number,name varchar(4)) tablespace
testblock;
然后插入三条数据然后提交:
insert into testblock values (1,'a');
insert into testblock values
(1,'b);
insert into testblock values (1,'c'):
commit;
select * from testblcok;
commit;
select file#,name from datafiles;
select rowid,dbms_rowid.rowid_relative_fno(rowid)
rel_fno,dbms_rowid.rowid_block_number(rowid)
blockno from testblock;
ROWID REL_FNO BLOCKNO
------------------ ---------- ----------
AAAMixAAFAAAAAMAAA 5 12
AAAMixAAFAAAAAMAAB 5 12
AAAMixAAFAAAAAMAAC 5 12
alter system dump datafile 5 block 12
show parameter dump