Data Blocks
Oracle 数据库以数据块(也称为 Oracle 块或页)为单位,来管理数据库数据文件中的逻辑存储空间。数据块是数据库 I/O 的最小单位。
Data Blocks and Operating System Blocks
在物理级别,存储在磁盘文件中的数据库数据由操作系统块组成。操作系统块是操作系统可以读取或写入的最小数据单位。相比之下, Oracle 块是一个逻辑存储结构,其大小和结构对操作系统是透明的。操作系统块与数据块的大小可能有所不同。数据库按数据块(而不是按操作系统块)的倍数来请求数据。
Data Block Size
每个数据库都有一个数据库块大小。DB_BLOCK_SIZE 初始化参数在数据库被创建时设置其数据块大小。此大小是SYSTEM和SYSAUX表空间的大小,并且是其它表空间的默认大小。不能更改数据库的块大小,除非重新创建数据库。
如果尚未设置 DB_BLOCK_SIZE,则默认数据块大小特定于操作系统。数据库的标准数据块大小为 4 KB 或8 KB。如果数据块和操作系统块的大小不同,则数据块大小必须是操作系统块大小的整数倍。
你可以创建其块大小不同于DB_BLOCK_SIZE设定值的表空间。当你需要将一个可移动表空间移动到一个不同的平台时。
Data Block Format
每个数据块有一个格式或内部结构,使得数据库能够跟踪块中的数据和可用空间。各种数据块的格式是类似的,无论其包含的是表、 索引、或表簇数据。图显示了一个未压缩的数据块的格式.
Data Block Overhead
Oracle 数据库使用块开销来管理块本身。块开销不能用来存储用户数据。
块开销将包括以下部分:
块头
此部分包含关于块的一般信息,包括磁盘地址和段类型。对于事务管理块,其块头包含活动的和历史的事务信息。
每个更新块的事务都需要一个事务条目。Oracle 数据库预先在块头中为事务条目保留空间。在分配给段用于支持事务性更改的数据块中,当块头空间耗尽时,可用空间也可以容纳事务条目。事务条目所需的的空间取决于操作系统。但是,绝大多数操作系统中的事务条目需要大约 23 个字节。
表目录
对于堆组织表,此目录包含有关其行存储在该块中的表的元数据。多个表可以将行存储在相同的块中。
行目录
对于堆组织表,此目录描述该块的数据部分中的行的位置。当已在行目录中分配空间后,即使在行被删除后,数据库也不会回收此空间。因此,就算某块现在是空的,但若之前曾经达到 50 行,则在行目录仍会保留已分配的100 字节。仅在块中插入新行时,数据库才会重用此空间。
Row Format
块的行数据部分包含实际数据,如表行或索引键条目等。正如每个数据块具有一个内部的格式,每一行也有一个行格式,使得数据库能够跟踪行中的数据。
Oracle 数据库以可变长度记录形式来存储行。行包含在一个或多个行片断中。每个行片断有一个行头和列数据。图显示了行格式。
Row Header
Oracle 数据库使用行头来管理存储在块中的行片断。行头包含以下信息:
行片断中的各列
位于其他数据块中的各个行片断
如果整个行可以插入到一个数据块中,则Oracle数据库将该行存储为一个行片断。但是,如果所有行数据不能插入一个单一的块,或者一个更新导致现有的行不能容纳在原来的块中,则数据库将该行存储为多个行片断(请参阅"链接行和迁移行")。数据块中通常每行只包含一个行片断。
表簇的簇键(见"表簇概述")
Column Data
在行头之后的列数据部分存储行中的实际数据。对行片断中的每一列, Oracle 数据库独立地存储列长度和列数据。所需的空间取决于数据类型。如果列的数据类型是可变长度的,则用于容纳一个值所需的空间可能在其数据被更新时会增长和收缩。
Rowid
Oracle 数据库使用一个rowid唯一地标识一行。在内部,rowid 是一个结构,用于保存数据库访问行所需要的信息。一个 rowid 并不物理地存储在数据库中,而是从存储数据的文件和块推导而来的。
扩展的 rowid 包括数据对象号。这种rowid 类型使用每个行的物理地址的 64进位编码。编码的字符为 A-Z、a-z、0-9、+、和/。
图说明了一个扩展的 rowid 的格式。
一个扩展 rowid 以一个四段式格式显示,OOOOOOFFFBBBBBBRRR,此格式分为以下几个组件:
OOOOOO
数据对象号标识段 (如示例中12-1中的数据对象AAAPec)。数据库中的每个段都被分配了一个数据对象号。同一段中的模式对象(如一个表簇)具有相同的数据对象号。
FFF
表空间相对数据文件号,标识包含行的数据文件 (如示例12-1中的文件 AAF)。
BBBBBB
数据块号标识包含行的块 (如示例12-1中的块AAAABS)。块号是相对于他们的数据文件的,而不是其表空间。因此,具有相同块号的两行,可以驻留在同一表空间的不同数据文件中。
RRR
行号标识块中的行(如示例 12-1中的 AAA)。
在一个 rowid被分配给一个行片断后,该rowid 在特殊情况下可以更改。例如,如果启用了行移动,则rowid 可能会因为分区键更新、 闪回表操作、 收缩表操作等而发生变化。如果禁用了行移动,则如果使用 Oracle 数据库实用程序导出和导入了行,其rowid可能会发生变化。
在内部,数据库执行行移动,就像行是被物理地删除、然后又重新插入。不过,行移动被认为是更新,会隐含触发触发器。
Data Block Compression
数据库可以使用表压缩来消除在数据块中的重复值。使用基本表压缩和OLTP 表压缩的数据块,其格式与一个未压缩的块实质上是相同的。区别是使用位于块开头的符号表来存储行和列的重复值。数据库使用一个到符号表的短引用来替换这些重复出现的值。
假定示例12-2中的行,存储在具有七个列的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
当在此表上应用基本或 OLTP 表压缩时,数据库会将重复值替换为一个符号引用。示例12-3是压缩的一个概念性展示,使用符号*替换了29-NOV-00,而使用%替换了9999。
示例12-3 sales表中的OLTP压缩行
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
Space Management in Data Blocks
随着数据库从底向上不断填充数据块,在行数据和块头之间的可用空间就会逐渐减少。在更新期间,当将一个尾部空值更改为非空值时,可用空间也会变少。数据库会管理数据块中的可用空间,以优化性能并避免空间浪费。
Percentage of Free Space in Data Blocks
PCTFREE 存储参数对于数据库如何管理其可用空间非常重要。此SQL 参数设置为更新现有的行而保留的可用空间最小百分比。因此,PCTFREE 对于防止行迁移并避免空间浪费非常重要。
例如,假设您创建了一个只是偶尔需要更新的表,其中大多数更新都不会增加现有数据的大小。你可以在CREATE TABLE 语句中指定 PCTFREE 参数,如下所示:
CREATE TABLE test_table (n NUMBER) PCTFREE 20;
Coalescing Fragmented Space 合并碎片空间
被释放的空间与数据块可用空间的主要区域可能是连续的,也可能是不连续的,不连续的可用空间称为碎片空间。只有在满足以下条件时,Oracle 数据库才会自动且透明地合并数据块中的可用空间:
INSERT或UPDATE语句试图使用的块,包含足够的可用空间来容纳新的行片断。
可用空间已被碎片化,以至于该行片断不能插入到块中的某一个连续区域。
Reuse of Index Space 重用索引空间
数据库可以重复使用一个索引块内的空间。例如,如果您往列中插入了一个值,又将其删除,而对此列的索引仍然存在,则数据库可以在某行需要时,重新使用该索引槽位。
数据库可以重复使用一个索引块本身。与表块不同,一个索引块仅当其完全为空时,它才是空闲的。数据库将空块放入索引结构的空闲列表中并使其可重新使用。然而,Oracle 数据库不会自动压缩索引: 这需要一个ALTER INDEX REBUILD或COALESCE语句。
Chained and Migrated Rows 链接和已迁移的行
Oracle 数据库必须管理太大而不能放入一个单一块的行。可能存在下列情况:
该行太大,在它第一次插入时,无法放入一个数据块。
在行链接中,Oracle 数据库将数据存储在为段保留的一个或多个被链接的数据块中。行链接最经常出现在大行中。
超过 255 个列的行。
Oracle 数据库在一个行片断中只能存储 255 的列。因此,如果你在具有1000个列的表中插入行,则数据库将创建 4个行片断,通常会链接多个块。
图 12-14 描述了向数据块中插入大行的情形。行对于左边的块太大,所以数据库通过将第一个行片断放入在左边的块,将第二个行片断放入右边的块中,形成行链接。
本来可以放入一个数据块的行,在更新后整体行长增加了,但没有足够的可用空间来容纳更新的行。
在行迁移中,假设行可以容纳在一个新块中,Oracle 数据库将整个行移动到一个新的数据块。已迁移行的原始行片断,包含一个指针或“转发地址”到包含已迁移行的新块。已迁移行的 rowid 不会更改。
当行被链接或迁移时,检索数据所需的 I/O 会增加。会导致这种情况是因为 Oracle 数据库必须扫描多个块以检索行信息。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25427762/viewspace-777178/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25427762/viewspace-777178/