Oracle数据块结构概述-阿里云开发者社区

开发者社区> 数据库> 正文

Oracle数据块结构概述

简介: 整理自Oracle 11g R2 官方文档《concepts》001 概述     Oracle数据库以数据块(也称为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 可能会发生变化。
注意:
    在内部,数据库执行行移动,就像行是被物理地删除、然后又重新插入。不过,行移动被认为是更新,会隐含触发触发器。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章