数据块(Oracle Data Blocks)本文简称为块是Oracle最小的存储单位Oracle数据存放在块中一个块占用一定的磁盘空间特别注意的是这里的块是Oracle的数据块不是操作系统的块
Oracle每次请求数据的时候都是以块为单位也就是说Oracle每次请求的数据是块的整数倍如果Oracle请求的数据量不到一块Oracle也会读取整个块所以说块是Oracle读写数据的最小单位或者最基本的单位
块的标准大小由初始化参数DB_BLOCK_SIZE指定具有标准大小的块称为标准块(Standard Block)块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block)同一数据库中Oraclei及以上版本支持同一数据库中同时使用标准块和非标准块Oracle允许指定种非标准块(Nonstandard Block)
操作系统每次执行I/O的时候是以操作系统的块为单位Oracle每次执行I/O的时候都是以Oracle的块为单位
Oracle数据块大小一般是操作系统块的整数倍
数据块的格式(Data Block Format)
块中存放表的数据和索引的数据无论存放哪种类型的数据块的格式都是相同的块由块头(header/Common and Variable)表目录(Table Directory)行目录(Row Directory)空余空间(Free Space)和行数据(Row Data)五部分组成
如下图所示
块头(header/Common and Variable)存放块的基本信息如块的物理地址块所属的段的类型(是数据段还是索引段) 表目录(Table Directory)存放表的信息即如果一些表的数据被存放在这个块中那么这些表的相关信息将被存放在表目录中
行目录(Row Directory)如果块中有行数据存在则这些行的信息将被记录在行目录中这些信息包括行的地址等
行数据(Row Data)是真正存放表数据和索引数据的地方这部分空间是已被数据行占用的空间
空余空间(Free Space)空余空间是一个块中未使用的区域这片区域用于新行的插入和已经存在的行的更新
头部信息区(Overhead)我们把块头(header/Common and Variable)表目录(Table Directory)行目录(Row Directory)这三部分合称为头部信息区(Overhead)头部信息区不存放数据它存放的整个块的信息头部信息区的大小是可变的一般来说头部信息区的大小介于字节(bytes)到字节(bytes)之间
数据块中自由空间的使用
当往数据库中插入(INSERT)数据的时候块中的自由空间会减少当对块中已经存在的行进行修改(UPDATE)的时候(使记录长度增加)块中的自由空间也会减少
DELETE语句和UPDATE语句会使块中的自由空间增加当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候Oracle会释放出一部分自由空间释放出的自由空间并不一定是连续的通常情况下Oracle不会对块中不连续的自由空间进行合并因为合并数据块中不连续的自由空间会影响数据库的性能只有当用户进行数据插入(INSERT)或者更新(UPDATE)操作却找不到连续的自由空间的时候Oracle才会合并数据块中不连续的自由空间
对于块中的自由空间Oracle提供两种管理方式自动管理手动管理
行链接和行迁移(Row Chaining and Migrating)
行链接(Row Chaining)如果我们往数据库中插入(INSERT)一行数据这行数据很大以至于一个数据块存不下一整行Oracle就会把一行数据分作几段存在几个数据块中这个过程叫行链接(Row Chaining)如下图所示
如果一行数据是普通行这行数据能够存放在一个数据块中如果一行数据是链接行这行数据存放在多个数据块中
行迁移(Row Migrating)数据块中存在一条记录用户执行UPDATE更新这条记录这个UPDATE操作使这条记录变长这时候Oracle在这个数据块中进行查找但是找不到能够容纳下这条记录的空间无奈之下Oracle只能把整行数据移到一个新的数据块原来的数据块中保留一个指针这个指针指向新的数据块被移动的这条记录的ROWID保持不变行迁移的原理如下图所示
无论是行链接还是行迁移都会影响数据库的性能Oracle在读取这样的记录的时候Oracle会扫描多个数据块执行更多的I/O
块中自由空间的自动管理
Oracle使用位图(bitmap)来管理和跟蹤数据块这种块的空间管理方式叫自动管理自动管理有下面的好处
◆易于使用
◆更好地利用空间
◆可以对空间进行实时调整
块中自由空间的手动管理
用户可以通过PCTFREE PCTUSED来调整块中空间的使用这种管理方式叫手动管理相对于自动管理手动管理方式比较麻烦不容易掌握容易造成块中空间的浪费
PCTFREE参数用于指定块中必须保留的最小空闲空间百分例之所以要预留这样的空间是因为UPDATE时需要这些空间如果UPDATE时没有空余空间Oracle就会分配一个新的块这会产生行迁移(Row Migrating)
PCTUSED也是用于设置一个百分比当块中已使用的空间的比例小于这个百分比的时候这个块才被标识为有效状态只有有效的块才被允许插入数据