Oracle数据块结构概述

整理自Oracle 11g R2 官方文档《concepts》

001 概述
    Oracle数据库以数据块(也称为Oracle块或)为单位,来管理数据库数据文件中的逻辑存储空间。数据块是数据库I/O的最小单位。

002 数据块和操作系统块
    在物理级别,存储在磁盘文件中的数据库数据由操作系统块组成。操作系统块是操作系统可以读取或写入的最小数据单位。相比之下,Oracle块是一个逻辑存储结构,其大小和结构对操作系统是透明的。下图显示操作系统块与数据块的大小可能有所不同。数据库按数据块(而不是按操作系统块)的倍数来请求数据。     

    当数据库请求一个数据块时,操作系统将此操作转换为对永久存储数据的多个请求。数据块与操作系统块的逻辑分离具有以下含义:
    ·应用程序不需要确定磁盘上的数据的物理地址。
    ·数据库数据可以在多个物理磁盘上进行条带化或镜像。

003 数据块大小
    每个数据库都有一个数据库块大小。DB_BLOCK_SIZE初始化参数在数据库被创建时设置其数据块大小。此大小是system和sysaux表空间的大小,并且是其他表空间的默认大小。不能更改数据库的块大小,除非重新创建数据库。
    如果尚未设置DB_BLOCK_SIZE,则默认数据块大小特定于操作系统。数据库的标准数据块大小为4KB或8KB。如果数据块和操作系统块的大小不同,则数据块大小必须是操作系统块大小的整数倍。

004 表空间块大小
    你可以创建其块大小不同于DB_BLOCK_SIZE设定值的表空间。当你需要将一个可移动表空间移动到一个不同的平台时,非标准的块大小非常有用。

005 数据块格式
    每个数据块有一个格式或内部结构,使得数据库能够跟踪块中的数据和可用空间。各种数据块的格式是类似的,无论其包含的是表、索引、或表簇数据。下图显示了一个未压缩的数据块的格式,由上而下依次是即块头、表目录、行目录、空闲空间和行数据。

006 数据块开销
    Oracle数据库使用块开销来管理块本身。块开销不能用来存储用户数据。块开销将包括以下部分:
    ·块头
    此部分包含关于块的一般信息,包括磁盘地址和段类型。对于事务管理块,其块头包含活动的和历史的事务信息
    每个更新块的事务都需要一个事务条目。 Oracle 数据库预先在块头 中为事务条目保留空间。 在分配给段用于支持事务性更改的数据块 中,当块头空间耗尽时,可用空间也可以容纳事务条目。事务条目所 需的的空间取决于操作系统。但是, 绝大多数操作系统中的事务条目 需要大约 23 个字节。
    ·表目录
    对于堆组织表,此目录包含有关其行存储在该块中的表的元数据 个表可以将行存储在相同的块中。
    ·行目录
    对于堆组织表,此目录描述该块的数据部分中的行的位置当已在行目录中分配空间后,即使在行被删除后,数据库也不会回收 此空间因此,就算某块现在是空的,但若之前曾经达到 50 行,则 在行目录仍会保留已分配的 100 字节。仅在块中插入新行时,数据 库才会重用此空间。

    块开销的某些部分是大小固定的,但总的大小是可变的。平均起来,块开销 总计在 84 到 107 字节左右。


007 行格式
    块的行数据部分包含实际数据,如表行或索引键条目等。正如每个数据块具有一个内部的格式,每一行也有一个格式,使得数据库能够跟踪行中的数据。
    Oracle数据库以可变长度记录形式来存储行。行包含在一个或多个行片断中。每个行片断有一个行头和列数据。


 ·行头
    Oracle数据库使用行头来管理存储在块中的行片断。行头包含以下信息:
    行片断中的各列
    表簇的簇键
    位于其他数据块中的各个行片断
        如果整个行可以插入到一个数据块中,则Oracle数据库将该行存储为一个行片断。但是,如果所有行数据不能插入一个单一的块,或者一个更新导致现有的行不能容纳在原来的块中,则数据库将该行存储为多个行片断。数据块中通常每行只包含一个行片断。
    包含在一个块中的完全行至少有 3 个字节的行头。

·列数据
    在行头之后的列数据部分存储行中的实际数据。行片断通常按 CREATE  TABLE 语句中列出的顺序来存储列,但这个顺序并不总是能保证的。例 如,LONG 类型列总是在最后。
    如上图所示,对行片断中的每一列,Oracle 数据库独立地存储列长度和 列数据。所需的空间取决于数据类型。如果列的数据类型是可变长度的,则 用于容纳一个值所需的空间可能在其数据被更新时会增长和收缩。
    每一行都在数据块标头的行目录中有一个槽位。槽位指向行的开始部分。

·Rowid 格式
    Oracle 数据库使用一个 rowid 唯一地标识一行。在内部, rowid 是一个结 构,用于保存数据库访问行所需要的信息。一个 rowid 并不物理地存储在数 据库中,而是从存储数据的文件和块推导而来的。
    扩展的 rowid 包括数据对象号。这种 rowid 类型使用每个行的物理地址的  64 进位编码。编码的字符为 A-Z、 a-z、 0-9、 +、和/。

下面的示例用来查询 ROWID 伪列来显示 employees 表中雇员 100 的所在行的  扩展 rowid。
SYS@ORCL > select rowid from hr.employees where employee_id=100;

ROWID
------------------
AAAVTFAAFAAAADPAAA

    一个扩展 rowid 以一个四段式格式显示, OOOOOOFFFBBBBBBRRR, 此格 式分为以下几个组件:
    · OOOOOO 
    数据对象号标识段,即data object number(如示例中的数据对象 AAAVTF)。 数据库中的每个段都被分配了一个数据对象号。同一段中的模式对象( 如一 个表簇)具有相同的数据对象号。
    · FFF
    表空间相对数据文件号,即relative file number,标识包含行的数据文件 (如示例中的文件 AAF)
    ·BBBBBB
    数据块号标识包含行的块,即block number( 如示例中的块 AAAADP) 。块号是 相对于他们的数据文件的,而不是其表空间。因此, 具有相同块号的 两行,可以驻留在同一表空间的不同数据文件中。
    · RRR
    行号标识块中的行,即row number(如示例中的 AAA) 。

    在一个 rowid 被分配给一个行片断后, 该 rowid 在特殊情况下可以更改。例如,如果启用了行移动,则 rowid 可能会因为分区键更新、闪回表操作、收缩表操作等而发生变化。如果禁用了行移动,则如果使用 Oracle 数据库实用程序导出和导入了行,其 rowid 可能会发生变化。
注意:
    在内部,数据库执行行移动,就像行是被物理地删除、然后又重新插入。不过,行移动被认为是更新,会隐含触发触发器。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29067253/viewspace-1978240/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29067253/viewspace-1978240/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值