Oracle逻辑存储结构概述
逻辑存储结构简介
Oracle 数据库为数据库中的所有数据分配逻辑空间。
逻辑上,数据库空间分配的逻辑单元是数据块、 扩展区(extent)(extent)、 段、和表空间。
物理上,数据被存储在磁盘上的数据文件中 ,数据文件中的数据存储在操作系统块中。
逻辑存储结构特征
1、数据块是数据库 I/O 的最小单位,是Oracle数据库中最细的粒度级别存取单位, Oracle 数据库将数据存储为数据块。
2、一个逻辑数据块对应于特定字节数的物理磁盘空间,比如 8KB(默认建库数据块大小为8K)。
3、数据块是 Oracle 数据库可以使用或分配的最小存储单位。
4、扩展区(extent)是一组逻辑上连续的数据块,被分配来用于存储特定类型的信息。
5、单个扩展区(extent)不能跨越多个数据文件,即单个扩展区只能属于一个数据文件。
6、段是为一个特定数据库对象(如一个表)分配的一组 扩展区(extent)。例如,employees 表的数据存储在其自己的数据段中,而该表的每个索引存储在其自己的索引段中。会消耗存储空间的每个数据库对象都由单个段组成。
7、每个段属于且仅属于一个表空间。因此,一个段的所有 扩展区(extent)存储在相同的表空间中。在一个表空间中,一个段可以包括多个数据文件中的扩展区(extent)。
逻辑存储结构和物理存储结构的映射关系
下图是一个逻辑存储结构和物理存储结构的映射关系图

备注:表这个逻辑概念,主要用于方便理解,可以去掉;表空间、段、区、数据块,主要由四个逻辑结构组成。
逻辑存储层次结构
下图显示了在表空间中的数据块、 扩展区(extent)(extent)、和段之间的关系。在此示例中,一个段具有分别存储在不同数据文件中的两个 扩展区(extent)。

备注:
1、上图中,这个 24 KB 的 扩展区(extent)有 12 个数据块,而这个 72 KB 的 扩展区(extent)有 36 个数据块。
2、段的一个 扩展区(extent)可能存储在 users01.dbf 中,而另一个存储在 users02.dbf 中。
3、表空间---段---扩展区--数据块 ,这样的逻辑存储层次构成
逻辑空间管理
Oracle 数据库必须使用逻辑空间管理来在表空间中跟踪并分配扩展区(extent)。
当数据库对象需要扩展区(extent)时,该数据库必须有查找和分配扩展区(extent)的方法。同样,当对象不再需要扩展区(extent)时,数据库必须提供一种方法来重用可用空间。
Oracle 数据库基于创建的表空间的类型来管理其中的空间。两种类型,如下:
1、本地管理表空间 (默认值)
数据库使用表空间本身中的位图来管理扩展区(extent)。因此,本地管理表空间需要预留表空间的一部分用于位图。在一个表空间中,数据库可以使用自动段空间管理 (ASSM)或手动段空间管理 (MSSM)来管理段 。
表空间的每个数据文件头中维护一个位图,记录数据文件中的可用和已用空间信息。
2、字典管理表空间
数据库使用数据字典来管理 扩展区(extent) ,数据字典表中记录表空间中使用的分配和空闲、已用和可用的元数据。
下图显示了一个表空间中的逻辑空间管理方法的可选方案。

本地管理表空间
本地管理表空间在数据文件头中维护一个位图 ,以跟踪数据文件体中的可用空间和已用空间。
每一位对应一组块。
当空间被分配或释放时,Oracle 数据库更改位图值,以反映数据块的新状态。
下面的图形是位图管理存储的概念表示。标头中的 1 是指已用空间,而 0 指可用空间。

本地管理表空间优势
1、避免使用数据字典来管理扩展区(extent)
如果消耗或释放一个扩展区(extent)会导致在数据字典表需要记录这些元数据变更,即对数据字典表进行DML操作来实现,这个DML操作会在系统表空间、撤消段中消耗或释放空间,因此字典管理的表空间,扩展区的分配和释放,会发生一系列的递归操作。
2、自动跟踪相邻的可用空间
通过这种方式,数据库消除了合并空闲扩展区(extent)的需要。
3、自动确定本地管理扩展区(extent)的大小,或者在本地管理表空间中所有的扩展区(extent)可以具有相同的大小,并覆盖对象存储选项。
4、本地管理表空间,在并发情况下,性能上、稳定上远远高于字典管理表空间。
注意:Oracle 强烈建议使用自动段空间管理的本地管理表空间。
字典管理表空间
字典管理表空间使用数据字典来管理其扩展区(extent)。每当分配或释放了一个 扩展区(extent)时, Oracle 数据库更新数据字典中的表。例如,当表需要扩展区(extent)时,数据库查询数据字典表,并搜索空闲扩展区(extent)。如果数据库找到了空间,则修改一个数据字典表,并插入一行。按这种方式,数据库通过修改和移动数据来管理空间。
数据库在后台为数据库对象获取空间而执行的 SQL 是递归 SQL 。
频繁使用递归 SQL 可能会对性能有负面影响,因为必须串行化对数据字典的更新。
而默认的本地管理表空间(数据文件头中位图方式记录)避免了这种性能问题。
建议将《Oracle数据库逻辑存储结构》、《Oracle数据库表空间概述》、《Oracle数据库段segment概述》、《Oracle数据库扩展区(extent)概述》、《Oracle数据库数据块概述》这5篇文章一起看,对Oracle数据库的逻辑结构会有全面的理解。