oracle中块的状态分为,oracle 数据块详解

数据库的逻辑结构包括:数据块,区,段​

oracle

数据块是oracle数据库的存储基础,由磁盘空间的若干字节组成,数据块是oracle的最小逻辑单元可以定义数据块为2k,4k,8k,16k,32k甚至更大,默认的oracle数据块为8k,我们通常称为oracle块,当然正常情况下oracle数据块应该是os块的整数倍,和标准块不同的是非标准块,在oracle9i之后支持同一个数据库中

同时使用标准块和非标准块。​

a4c26d1e5885305701be709a3d33442f.png

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、 如果行小且访问连续的,或者有较大的行,则选择较大尺寸的块。

就是说看我们的业务系统​

数据块的基本组成:​

a4c26d1e5885305701be709a3d33442f.png

快结构的说明:​

块头:存放一些基本的信息,如物理位置,块所属的段类型(数据段,索引段,回滚段)。​​

表目录:如果块中存储的数据为表数据,则表目录中保存这个表的相关信息

行目录:如果块中存储的数据为表数据,则行目录中保存数据行的相关信息​

块头,行目录和表目录组成了块的头部信息(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)。​

a4c26d1e5885305701be709a3d33442f.png

如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。​

行迁移(Row

Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。行迁移的原理如下图所示:​

a4c26d1e5885305701be709a3d33442f.png

无论是行链接还是行迁移,都会影响数据库的性能。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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值