oracle数据块学习

数据库的逻辑结构包括:数据块,区,段,表空间。

数据库的物理结构包括:操作系统块、数据文件。        

一、基本说明

Oracle数据块是oracle数据库存储基础,磁盘空间的若干字节组成,数据块是oracle数据库的最小逻辑单元,可以定义数据块为2k、4k、8k、16k、32k甚至更大,默认oracle块大小是8k。正常情况下oracle块应该是操作系统块的整数倍。(出于性能考虑OS块最好小于oracle块)

Oracle块大小设置在初始化参数文件里面(init.ora中的db_block_size中设置,块是处理update、insert、select数据事务的最小单位,当用户从表中选择数据时,将在oracle块

上读取或是提取数据。意思就是说:os每次执行i/o时候,是以os的块为单位;oracle每次执行i/o时候,是以oracle块为单位

二、块的组成

        块结构说明如下:  

块头:存放一些基本信息,如物理位置,块所属的段类型(数据段、索引段、回滚段等)
表目录:如果块中存储的数据为表数据,则表目录中保存这个表的相关信息
行目录:如果块中存储的数据为表数据,则行目录中保存数据行的相关信息。
块头、表目录和行目录组成块的头部信息(overhead,这部分不存数据库中实际的数据,而是用来记录该块的逻辑结构,而且这部分占用的空间不是固定的,大约在84-107字节之间。
行记录:真正存放数据的区域,这部分空间已被使用。
空闲空间:未使用的区域,用于新行的插入或者已经存在行的更新。

       自由空间的使用

        Insert这时候块的自由空间会减少,
        update的时候块的自由空间也会减少
        当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候,Oracle会释放出一部分自由空间。释放出的自由空间并不一定是连续的,常情况下,Oracle不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。
如果 INSERT 语句与(update、delete)操作在同一事务(transaction)中,且位于释放空间的语句之后,那么 INSERT 语句可以使用被释放的空间。
● 如果 INSERT 语句与释放空间的语句在不同的事务中(比如两者是由不同的用户提交的),那么只有在释放空间的语句提交后,且插入数据必需使用    此数据块时,INSERT 语句才会使用被释放的空间。
●数据块(data block)中被释放出的空间未必与可用空间区(free space)相连续。Oracle在满足以下条件时才会将释放的空间合并到可用空间区:
(1)INSERT 或 UPDATE 语句选中了一个有足够可用空间容纳新数据的数据块,
(2)但是此块中的可用空间不连续,数据无法被写入到数据块中连续的空间里。

 行链接和行迁移

 
       行链接:如果我们往数据库中插入(INSERT一行数据,这行数据很大,以至于一个数据块存不下一整行,Oracle就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(Row Chaining);如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。
       行迁移(Row Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。


    无论是行链接还是行迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执行更多的I/O。而且是成倍加大i/o。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值