必威体育Betway必威体育官网
当前位置:首页 > IT技术

数据块(Data Block)

时间:2019-10-29 14:14:31来源:IT技术作者:seo实验室小编阅读:51次「手机版」
 

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

一、官档

  • 12c:Books → Concepts → Part IV Oracle Database Storage structures → Logical Storage Structures → 12.2 Overview of Data Blocks

二、数据块和操作系统

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

图 1:数据块和操作系统块

当数据库请求一个数据块时,操作系统将此操作转换为对永久存储数据的多个请求。数据块与操作系统块的逻辑分离具有以下含义:

  • 应用程序不需要确定磁盘上的数据的物理地址
  • 数据库数据可以在多个物理磁盘上进行条带化或镜像

1、数据块大小

每个数据库都有一个数据块大小

DB_BLOCK_SIZE 初始化参数在数据库被创建时设置其数据块大小。 此大小是 SYSTEM 和 SYSAUX 表空间的大小, 并且是其它表空间的默认大小。 不能更改数据库的块大小, 除非重新创建数据库。

如果尚未设置 DB_BLOCK_SIZE,则默认数据块大小特定于操作系统。 数据库的标准数据块大小为 4 KB 或 8 KB。如果数据块和操作系统块的大小不同, 则数据块大小必须是操作系统块大小的整数倍。

See Also:

  • 《Oracle Database Reference》了解 DB_BLOCK_SIZE 初始化参数
  • 《Oracle Database AdMinistrator’s Guide》和《Oracle Database Performance Tuning Guide》了解如何选择块大小

2、表空间块大小

你可以创建其块大小不同于 DB_BLOCK_SIZE 设定值的表空间。 

当你需要将一个可移动表空间移动到一个不同的平台时,非标准的块大小非常有用。

See Also:

  • 《Oracle Database Administrator’s Guide》了解如何为表空间指定非标准的块大小

3、数据块格式

每个数据块有一个格式或内部结构,使得数据库能够跟踪块中的数据和可用空间。 各种数据块的格式是类似的,无论其包含的是表、 索引、 或表簇数据。

图 2:显示了一个未压缩的数据块的格式

See Also:

  • 《Data Block Compression》:了解压缩块

3.1、数据块开销

Oracle 数据库使用块开销来管理块本身。块开销不能用来存储用户数据。

如图 2 所示, 块开销将包括以下部分:

  • 块头

    此部分包含关于块的一般信息,包括磁盘地址和段类型。对于事务管理块,其块头包含活动的和历史的事务信息。

    每个更新块的事务都需要一个事务条目。 Oracle 数据库预先在块头中为事务条目保留空间。 在分配给段用于支持事务性更改的数据块中,当块头空间耗尽时, 可用空间也可以容纳事务条目。 事务条目所需的的空间取决于操作系统。但是, 绝大多数操作系统中的事务条目需要大约 23 个字节

  • 表目录

    对于堆组织表,此目录包含有关其行存储在该块中的表的元数据。多个表可以将行存储在相同的块中。

  • 行目录

    对于堆组织表, 此目录描述该块的数据部分中的行的位置。数据库可以在块底部的任何地方放置一行。行地址记录在行目录向量的一个槽中。

    一个rowid指向一个特定的文件,块,和行号。例如,在ROWID AAAPecAAFAAAABSAAA,最终AAA代表行号。行号是行目录中的项的索引。行目录项包含指向数据块上的行位置的指针。如果数据库在一个块中移动一行,那么数据库更新行目录条目来修改指针。rowid保持不变。

    当已在行目录中分配空间后, 即使在行被删除后, 数据库也不会回收此空间。因此, 就算某块现在是空的,但若之前曾经达到 50 行,则在行目录仍会保留已分配的 100 字节。仅在块中插入新行时,数据库才会重用此空间。

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

3.2、行格式

块的行数据部分包含实际数据,如表行或索引键条目等。正如每个数据块具有一个内部的格式,每一行也有一个行格式,使得数据库能够跟踪行中的数据。

Oracle 数据库以可变长度记录形式来存储行。行包含在一个或多个行片断中。每个行片断有一个行头和列数据。

图 3:显示了行格式。

3.2.1 行头

Oracle 数据库使用行头来管理存储在块中的行片断。

行头包含以下信息:

  • 行片断中的各列
  • 位于其他数据块中的各个行片断

    如果整个行可以插入到一个数据块中, 则 Oracle 数据库将该行存储为一个行片断。但是,如果所有行数据不能插入一个单一的块,或者一个更新导致现有的行不能容纳在原来的块中,则数据库将该行存储为多个行片断 。数据块中通常每行只包含一个行片断。

  • 表簇的簇键
包含在一个块中的完全行至少有 3 个字节的行头。

See Also:

  • 《Chained and Migrated Rows》
  • 《Overview of Table clusters》

3.2.2 列数据

在行头之后的列数据部分存储行中的实际数据。行片断通常按 CREATE TABLE 语句中列出的顺序来存储列,但这个顺序并不总是能保证的。 例如,LONG 类型列总是在最后。

如图 3 所示,对行片断中的每一列, Oracle 数据库独立地存储列长度和列数据。所需的空间取决于数据类型。 如果列的数据类型是可变长度的,则用于容纳一个值所需的空间可能在其数据被更新时会增长和收缩。

每一行都在数据块标头的行目录中有一个槽位。 槽位指向行的开始部分。

See Also:

  • 《Table Storage》和《Index Storage》

3.2.3 Rowid 格式

Oracle 数据库使用一个 rowid 唯一地标识一行。 在内部, rowid 是一个结构, 用于保存数据库访问行所需要的信息。一个 rowid 并不物理地存储在数据库中, 而是从存储数据的文件和块推导而来的。

扩展的 rowid 包括数据对象号。这种 rowid 类型使用每个行的物理地址的 64 进位编码。编码的字符为 A-Z、 a-z、 0-9、 +、和/。

示例 1:ROWID 伪列

查询 ROWID 伪列来显示 employees 表中雇员 100 的所在行的扩展 rowid。 

sql> SELECT ROWID FROM employees WHERE employee_id = 100; 

ROWID
------------------
AAAPecAAFAAAABSAAA

图4:ROWID 格式

一个扩展 rowid 以一个四段式格式显示, OOOOOOFFFBBBBBBRRR, 此格式分为以下几个组件:

  • OOOOOO

    数据对象号标识段 (如示例1 中的数据对象 AAAPec)。 数据库中的每个段都被分配了一个数据对象号。同一段中的模式对象(如一个表簇) 具有相同的数据对象号。

  • FFF

    表空间相对数据文件号, 标识包含行的数据文件 (如示例 1 中的文件 AAF)。

  • BBBBBB

    数据块号标识包含行的块 (如示例 1 中的块 AAAABS) 。块号是相对于他们的数据文件的,而不是其表空间。因此, 具有相同块号的两行,可以驻留在同一表空间的不同数据文件中。

  • RRR

    行号标识块中的行(如示例 1 中的 AAA) 。

在一个 rowid 被分配给一个行片断后,该 rowid 在特殊情况下可以更改。例如,如果启用了行移动,则 rowid 可能会因为分区键更新、闪回表操作、收缩表操作等而发生变化。如果禁用了行移动,则如果使用 Oracle 数据库实用程序导出和导入了行,其 rowid 可能会发生变化。

Note:

在内部,数据库执行行移动,就像行是被物理地删除、 然后又重新插入。不过,行移动被认为是更新,会隐含触发触发器。

See Also:

  • 《Rowid Data types
  • 《Oracle Database SQL Language Reference》 了解 rowid

3.3 数据块压缩

数据库可以使用表压缩来消除在数据块中的重复值。本节介绍使用压缩的数据块格式。

使用基本表压缩和 OLTP 表压缩的数据块,其格式与一个未压缩的块实质上是相同的。 区别是使用位于块开头的符号表来存储行和列的重复值。数据库使用一个到符号表的短引用来替换这些重复出现的值。

示例 2:sales 表中的行

假定行存储在具有七个列的 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 表压缩时,数据库会将重复值替换为一个符号引用。 示例 3 是压缩的一个概念性展示,使用符号*替换了 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

表1:符号表

符号
* 29-NOV-00 3 958-960
% 9999 5 956-960

See Also:

  • 《Table Compression》

3.4 数据块的空间管理

随着数据库从底向上不断填充数据块, 在行数据和块头之间的可用空间就会逐渐减少。 

在更新期间,当将一个尾部空值更改为非空值时, 可用空间也会变少。数据库会管理数据块中的可用空间, 以优化性能并避免空间浪费。

Note:

本节假定使用自动段空间管理。

3.4.1 数据块中的可用空间百分比

PCTFREE 存储参数对于数据库如何管理其可用空间非常重要。此 SQL 参数设置为更新现有的行而保留的可用空间最小百分比。因此, PCTFREE 对于防止行迁移并避免空间浪费非常重要。

例如,假设您创建了一个只是偶尔需要更新的表,其中大多数更新都不会增加现有数据的大小。 你可以在 CREATE TABLE 语句中指定 PCTFREE 参数,如下所示: 

CREATE TABLE test_table (n NUMBER) PCTFREE 20;

图 5 显示了将 PCTFREE 设置为 20 是如何影响空间管理的。数据库不断将行添加到块, 这将导致行数据朝着块头方向向上不断增长,而块头本身又朝行数据方向向下不断扩大。 该 PCTFREE 设置确保至少 20%的数据块是空闲的。 例如, 数据库可以防止一个 INSERT 语句填充该块, 使行数据和标头一共占据块总空间的 90%, 而只剩 10%可用空间。

图 5:PCTFREE

Note:

本讨论并不适用于 LOB 数据类型,它不使用 PCTFREE 存储参数或空闲列表。

See Also:

  • 《Overview of LOBs》
  • 《Oracle Database SQL Language Reference》关于 PCTFREE 参数的语法和语义

3.4.2 优化数据块中的可用空间

虽然可用空间的百分比不能小于 PCTFREE,但其可用空间量可以更大。例如,20%的 PCTFREE 设置可以防止可用空间总量少于 5%,但它允许该块具有 50%的可用空间。

3.4.2.1 调优增加可用空间

一些DML语句可以增加数据块中的可用空间

下面的语句可能会增加可用空间

  • DELETE 语句
  • UPDATE 语句,要么将现有值更新为更小的值,或者增大现有值并被强制迁移到另一个行
  • 在使用了 OLTP 压缩的表上的 INSERT 语句

    如果插入操作往块中填充了数据, 则数据库会调用块压缩,结果可能会导致在块中有更多的可用空间。

在下列条件下, 释放的空间可供 INSERT 语句使用:

  • 如果 INSERT 语句是位于释放空间的语句之后,且处于相同的事务中,则该语句可以使用已释放的空间。
  • 如果 INSERT 语句与释放空间的语句位于各自单独的事务中(也许是由另一个用户运行的), 只要另一个事务已提交,则该语句可以在需要此空间时使用它。
See Also:

《Oracle Database Administrator’s Guide》 了解 OLTP 压缩

3.4.2.2 合并碎片空间

被释放的空间与数据块可用空间的主要区域可能是连续的,也可能是不连续的。不连续的可用空间称为碎片空间。

图 6:具有碎片空间的数据块

只有在满足以下条件时, Oracle 数据库才会自动且透明地合并数据块中的可用空间,

  • INSERT 或 UPDATE 语句试图使用的块,包含足够的可用空间来容纳新的行片断。
  • 可用空间已被碎片化,以至于该行片断不能插入到块中的某一个连续区域。

合并后, 可用空间量与操作之前是相同的,只不过该空间现在已成为连续的。图 7 显示一个数据块的空间被合并了之后的情况。

图 7:数据块合并后的可用空间

Oracle 数据库仅在上述情况下执行合并, 否则会因为连续地合并数据块中的可用空间反而降低性能。

3.4.2.3 链接和已迁移的行

Oracle 数据库必须管理太大而不能放入一个单一块的行。 

可能存在下列情况:

  • 该行太大, 在它第一次插入时,无法放入一个数据块。

    在行链接中,Oracle 数据库将数据存储在为段保留的一个或多个被链接的数据块中。行链接最经常出现在大行中。示例包括包含 LONG或 LONG RAW 数据类型列的行、或在 2 KB 块中的 VARCHAR2(4000)列、或具有大量列的行。在这些情况下链接行是不可避免的。

  • 本来可以放入一个数据块的行,在更新后整体行长增加了,但没有足够的可用空间来容纳更新的行。

    在行迁移中, 假设行可以容纳在一个新块中, Oracle 数据库将整个行移动到一个新的数据块。 已迁移行的原始行片断,包含一个指针或“转发地址” 到包含已迁移行的新块。 已迁移行的 rowid 不会更改。

  • 超过 255 个列的行。

    Oracle 数据库在一个行片断中只能存储 255 的列。因此,如果你在具有 1000 个列的表中插入行,则数据库将创建 4 个行片断,通常会链接多个块。

图 8 描述了向数据块中插入大行的情形。行对于左边的块太大,所以数据库通过将第一个行片断放入在左边的块,将第二个行片断放入右边的块中,形成行链接。

图 8:行链接

在图 9 中, 左边的块包含的行被更新,致使该行现在太大而不能放入块中。数据库将整个行移动到右边的块中,并在左边的块中保留一个指向被迁移行的指针。

图 9:行迁移

当行被链接或迁移时,检索数据所需的 I/O 会增加。会导致这种情况是因为 Oracle 数据库必须扫描多个块以检索行信息。 例如, 如果数据库执行一个 I/O 读取索引和一个 I/O 读取一个未迁移的表行,则对于一个迁移行需要一个额外的 I/O 才能获得数据。

段顾问是一个 Oracle 数据库组件,可以手动或自动执行,使用此工具可以标识有空间可回收的段。 这个顾问工具可以对具有很多可用空间的对象,或有太多行链接的对象,提供建议。

See Also:

  • 《Row Storage》和《Rowids of Row Pieces》
  • 《Oracle Database Administrator’s Guide》 了解如何回收浪费的空间
  • 《Oracle Database Performance Tuning Guide》 了解如何减少行链接和行迁移

3.5 索引块概览

索引块是一种特殊类型的数据块,管理空间的方式不同于表块。Oracle数据库使用索引块管理索引中的逻辑存储空间。

3.5.1 索引块类型

索引包含一个根块、分支块和叶块

块类型定义如下:

  • 根块

    此块标识进入索引的入口点。

  • 分支块

    数据库导航通过分支块在搜索索引键。

  • 叶块

    这些块包含索引键值rowid指向相关的行。叶块以排序的顺序存储键值,这样数据库就可以有效地搜索键值范围内的所有行。

3.5.2 索引项的存储

索引项存储在索引块中,与表行存储在数据块中的存储形式是一样的。块部分中的索引项不是以二进制顺序存储的,而是堆在一个堆中。

数据库管理索引块中的行目录与数据块中的目录不同。行目录中的项(不是索引块体中的项)按键值排序。例如,在行目录中,索引键000000的目录项位于索引键111111的目录项之前,等等。

行目录中的项的排序提高了索引扫描的效率。在范围扫描中,数据库必须读取范围中指定的所有索引键。数据库遍历分支块以识别包含第一个键值的叶块。由于对行目录中的项进行排序,数据库可以使用二进制搜索来查找范围中的第一个索引键,然后依次通过行目录中的项进行排序,直到找到最后一个键为止。通过这种方式,数据库避免读取叶块体中的所有键。

See Also:

  • 《Data Block Overhead》

3.5.3 重用索引空间

数据库可以重复使用一个索引块内的空间。 

例如,如果您往列中插入了一个值,又将其删除,而对此列的索引仍然存在,则数据库可以在某行需要时,重新使用该索引槽位。索引块通常比堆组织表块有更多的行。在一个索引块中存储多行的能力使数据库更容易维护索引,因为它避免了块的频繁分割以存储新数据。

索引不能合并自身,尽管您可以使用ALTER INDEX 语句加REbuild 或 COALESCE选项手动将它们合并在一起。例如,如果插入列值从1到500000,如果删除包含偶数的行,则索引将包含250000个空槽。只有当数据库能够插入一个包含空槽的索引块时,它才会重新使用这个槽。

3.5.4 合并索引块

索引合并压缩现有的索引数据,如果重组释放块,则在索引结构中留下空闲块。因此,合并不会释放索引块用于其他用途,也不会导致索引重新分配块。

Oracle 数据库不会自动压缩索引: 这需要一个 ALTER INDEX 语句加 REBUILD 或 COALESCE 选项。

图 10 代表在 employees.department_id 列上的一个索引在其合并之前的情况。前面三个叶块只是部分填满的,如灰色填充线所示。

图 10:索引合并之前

图 11 显示图 10 中的索引在合并后的情况。前两个叶块现在已充满,如灰色填充线所示, 而第三个叶块已被释放了。

图 11:索引合并后

See Also:

  • 《Oracle Database Administrator’s Guide》 了解如何合并和重新生成索引
  • 《Oracle Database SQL Language Reference》 了解 COALESCE 语句

文章最后发布于: 2018-01-09 13:04:35

相关阅读

知乎问答:不要迷信数据分析

小编推荐:数据分析是很多人推崇的产品需求制定方法,用数据说话已经渐渐变成产品经理的至理名言,但不能迷信数据,毕竟数据的真实性、客

Databus架构分析与初步实践(for mysql)

https://sq.163yun.com/blog/article/173552201158811648 https://sq.163yun.com/blog/article/173554725500456960 description:

datatable组件后端分页

假设我们在html中有这样一个table:<table id="dataTableTest1" class="table table-border table-bordered table-bg table-hover

数据结构 二叉树的建立与遍历

二叉树(Binary Tree)是n(n >= 0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两颗互不相交的,分别称为根节点的左

确定数据中心建设规模需要考虑的问题

毋庸置疑,在数据中心设计出来之前,必须考虑数据中心的建设规模。数据中心建设规模的大小,与当前的投资成本以及

分享到:

栏目导航

推荐阅读

热门阅读