oracle数据块概述

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值