Oracle 数据库以称为数据块的单元(也称为Oracle 块或页)管理数据库数据文件中的逻辑存储空间。数据块是数据库 I/O 的最小单位。
数据块和操作系统块
在物理级别,数据库数据存储在由操作系统块组成的磁盘文件中。
操作系统块是操作系统可以读取或写入的最小数据单位。相反,Oracle 块是一种逻辑存储结构,其大小和结构对于操作系统来说是未知的。
下图显示操作系统块的大小可能与数据块不同。数据库请求多个数据块中的数据,而不是操作系统块。
数据块和操作系统块
当数据库请求一个数据块时,操作系统将此操作转换为对永久存储数据的请求。数据块与操作系统块的逻辑分离具有以下含义:
-
应用程序不需要确定磁盘上数据的物理地址。
-
数据库数据可以在多个物理磁盘上进行条带化或镜像。
数据库块大小
每个数据库都有一个数据库块大小。
DB_BLOCK_SIZE
初始化参数设置数据库创建时的数据块大小。大小是为SYSTEM
和SYSAUX
表空间设置的,是所有其他表空间的默认值。除非重新创建数据库,否则无法更改数据库块大小。
如果DB_BLOCK_SIZE
未设置,则默认数据块大小是操作系统特定的。数据库的标准数据块大小为 4 KB 或 8 KB。如果数据块和操作系统块的大小不同,则数据块大小必须是操作系统块大小的倍数。
表空间块大小
您可以创建块大小与DB_BLOCK_SIZE
设置不同的单个表空间。
数据块格式
每个数据块都有一个格式或内部结构,使数据库能够跟踪块中的数据和可用空间。无论数据块包含表、索引还是表簇数据,这种格式都是相似的。
下图显示了未压缩数据块的格式。
数据块开销
Oracle 数据库使用块开销来管理块本身。块开销不可用于存储用户数据。
如“数据块格式”所示,块开销包括以下部分:
-
块头
这部分包含有关块的一般信息,包括磁盘地址和段类型。对于事务管理的块,块头包含活动和历史事务信息。
每个更新块的事务都需要一个事务条目。Oracle 数据库最初在块头中为事务条目保留空间。在分配给支持事务更改的段的数据块中,空闲空间也可以在标头空间耗尽时保存事务条目。事务条目所需的空间取决于操作系统。但是,大多数操作系统中的事务条目大约需要 23 个字节。
- 表目录
对于堆组织表,此目录包含有关其行存储在此块中的表的元数据。在一个表簇中,多个表可以在同一个块中存储行。
- 行目录
于堆组织表,此目录描述了块的数据部分中行的位置。数据库可以在块底部的任何位置放置一行。行地址记录在行目录向量的槽之一中。
rowid 指向特定的文件、块和行号。例如,在 rowidAAAPecAAFAAAABSAAA
中,finalAAA
表示行号。行号是行目录中条目的索引。行目录条目包含指向数据块上行位置的指针。如果数据库在块内移动一行,则数据库更新行目录条目以修改指针。rowid 保持不变。
数据库在行目录中分配空间后,数据库在删除行后不会回收该空间。因此,当前为空但以前最多有 50 行的块继续为行目录分配 100 个字节。仅当会话在块中插入新行时,数据库才会重用此空间。
块开销的某些部分大小是固定的,但总大小是可变的。平均而言,块开销总计 84 到 107 个字节。
行格式
块的行数据部分包含实际数据,例如表行或索引键条目。正如每个数据块都有一个内部格式一样,每一行都有一个行格式,使数据库能够跟踪行中的数据。
Oracle 数据库将行存储为可变长度记录。一行包含在一个或多个部分中。每个部分称为一个排片。每个行块都有一个行标题和列数据。
行片段的格式
行标题
Oracle 数据库使用行标题来管理存储在块中的行片段。
行标题包含如下信息:
-
行片中的列
-
位于其他数据块中的行片段
如果可以将整行插入到单个数据块中,则 Oracle 数据库将该行存储为一行。但是,如果无法将所有行数据插入到单个块中,或者更新导致现有行超出其块,则数据库将该行存储在多个行块中。一个数据块通常每行只包含一个行块。
-
表簇的簇键
完全包含在一个块中的行至少有 3 个字节的行头。
列数据
在行标题之后,列数据部分存储行中的实际数据。CREATE TABLE
行块通常按照语句中列出的顺序存储列,但不能保证这种顺序。例如,LONG
最后创建类型的列。
如“行格式”中的图所示,对于一行中的每一列,Oracle 数据库分别存储列长和数据。所需空间取决于数据类型。如果列的数据类型是可变长度,则保存值所需的空间会随着数据的更新而增长和缩小。
每行在数据块头的行目录中都有一个槽。插槽指向行的开头。
行格式
Oracle 数据库使用rowid来唯一标识一行。在内部,rowid 是一种结构,它保存数据库访问行所需的信息。rowid 不是物理存储在数据库中,而是从存储数据的文件和块中推断出来的。
扩展的 rowid 包括数据对象编号。此 rowid 类型对每一行的物理地址使用 base 64 编码。编码字符为A-Z
、a-z
、0-9
、+
和/
。
ROWID 伪列
以下示例查询ROWID
伪列以显示employees
表中员工 100 的行的扩展 rowid:
SQL> SELECT ROWID FROM employees WHERE employee_id = 100; ROWID ------------------ AAAPecAAFAAAABSAAA
ROWID 格式
数据块压缩
数据库可以使用表压缩来消除数据块中的重复值。本节介绍使用压缩的数据块格式。
使用基本表和高级行压缩的数据块的格式与未压缩的块基本相同。不同之处在于块开头的符号表存储行和列的重复值。数据库将这些值的出现替换为对符号表的简短引用。
压缩数据块的格式
假设以下行存储在七sales
列表的数据块中:
2190,13770,25-NOV-00,S,9999,23,161 2225,15720,28-NOV-00,S,9999,25,1450 34005,120760,29-NOV-00,P,9999,44,2376 9425,4750,29-NOV-00,I,9999,11,979 1675,46750,29-NOV-00,S,9999,19,1121
当基本表或高级行压缩应用于此表时,数据库将用符号引用替换重复的值。以下压缩的概念表示法显示了符号*替换29-NOV-00和%替换9999:
2190,13770,25-NOV-00,S,%,23,161 2225,15720,28-NOV-00,S,%,25,1450 34005,120760,*,P,%,44,2376 9425,4750,*,I,%,11,979 1675,46750,*,S,%,19,1121
今天的文章数据块概述_块数据是什么分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/54362.html