Oracle 深入学习 Part 9: Storage Structure and Relationships(存储结构与关系)
在数据库管理系统(DBMS)中,Segment(段)、Extent(区块) 和 Block(块) 是描述数据库物理存储结构的三个重要概念。这些概念帮助理解数据库是如何在磁盘等存储设备上组织和管理数据的。通过这三个层次的结构,数据库能够高效地存储和访问大量数据。
图示结构:
Segment(段) └── Extent(区块) └── Block(块)
1. Segment(段)
Segment 是数据库存储结构中的一个更高层次的单位,它代表了数据库中某一类型的数据集合。一个 Segment 由多个 Extent 组成,通常对应于数据库中的某一具体对象,如表、索引或其他数据库对象。
2. Extent(区块)
Extent 是数据库中比块更大的单位,是逻辑上连续的blocks。不可跨datafile 只能存在一个数据文件中。
3. Block(块)
Block 是数据库存储结构的最小单位,是数据库在磁盘上进行 I/O 操作时的基本单位。数据库管理系统在进行读写操作时,会将数据按块进行存储和读取。
-
块大小在创建数据库之前就被规定好 无法修改
管理块的方式
在 Oracle 数据库中,自动块空间管理 (ASSM, Automatic Segment Space Management) 和 手动块空间管理 (Manual, MSSM) 是两种用于管理数据块中空闲空间的方式。它们决定了 Oracle 如何管理数据段(如表、索引)的存储空间分配和回收。
1. 自动块空间管理(ASSM)
自动块空间管理(ASSM) 通过 位图(bitmap) 来管理数据块中的空闲空间。
每个数据块在 ASSM 模式下都会有一个 位图,用于跟踪数据块内各个空间区域的使用情况,进而有效管理和分配空闲空间。
位图的结构:
位图是一个二进制的序列,每一位表示数据块中的一个固定空间区域。
例如,如果数据块大小为 8KB,并且每个数据块被划分为若干个小的空间单位(如每个空间单位大小为 64 字节),那么位图就会有 128 位,每一位代表 64 字节的空间是否已被使用。
0 表示该区域空闲。
1 表示该区域已被占用。
Oracle 会根据数据块的位图来判断哪些区域是空闲的,哪些已经被占用。当数据行插入、删除或更新时,位图会自动更新。
2. 手动块空间管理(MSSM)
手动管理(MSSM, Manual Segment Space Management) 就是指管理员需要手动控制数据段(如表、索引等)中空间的分配和回收。
在 Oracle 中,PCTFREE
、PCTUSED
和 FREELISTS
是用于手动块空间管理(MSSM)中的几个重要参数,它们控制着如何管理数据块的空间和空闲列表。通过这些参数,DBA 可以调整数据块的存储行为和空闲空间的分配,优化数据的插入和更新过程。
1. PCTFREE
PCTFREE
(即 "percent free")指定了在一个数据块中,最小的空闲空间百分比,留给将来的插入或更新数据。这意味着,在数据块中,PCTFREE
定义了每个数据块中至少要保持空闲的空间比例,以避免因为更新操作而引起空间不足。
-
默认值:通常为 10%,但可以根据需要进行调整。
-
作用:它确保在每个数据块中留有一定比例的空闲空间,以便处理未来的数据更新(比如增加数据行的长度)。这有助于避免数据更新时发生数据块的溢出。
-
示例: 如果你设置了
PCTFREE 20
,这意味着每个数据块至少会保留 20% 的空间用于未来的更新,剩下的 80% 将用于存储数据。
CREATE TABLE my_table ( id NUMBER, name VARCHAR2(100) ) PCTFREE 20;
2. PCTUSED
PCTUSED
(即 "percent used")控制一个数据块何时开始重新使用空闲空间。换句话说,当一个数据块的使用空间超过 PCTUSED
的百分比时,Oracle 会考虑这个数据块已经“满”并且可以进行新的数据插入。PCTUSED
的值通常比 PCTFREE
小。
-
默认值:通常为 40%,但可以根据需要进行调整。
-
作用:当一个数据块中已使用的空间超过
PCTUSED
设置的百分比时,Oracle 会尝试将新的数据插入到这个数据块中。通过设置PCTUSED
,可以有效地控制数据块的填充和空间的复用。 -
示例: 如果你设置了
PCTUSED 40
,这意味着当数据块的已用空间超过 40% 时,Oracle 将开始考虑将新的数据行插入到这个数据块中。
CREATE TABLE my_table ( id NUMBER, name VARCHAR2(100) ) PCTUSED 40;
3. FREELISTS
FREELISTS
是 Oracle 中用于管理多个空闲块列表的参数。它决定了数据块如何在多个空闲块列表中分配和回收。一个表可以有多个空闲列表,以便提高并发插入的性能,特别是在高并发环境下。
-
默认值:通常为 1 个空闲列表,但可以根据需要增加。
-
作用:通过设置多个
FREELISTS
,Oracle 可以在不同的空闲块列表之间分配插入操作,减少锁争用,提高并发性。每个空闲列表包含指向空闲空间的指针,确保空闲空间可以被并发操作使用。 -
示例: 如果设置了
FREELISTS 2
,那么就会为该表创建两个空闲列表,插入数据时 Oracle 会从两个空闲列表中选择一个进行操作。
CREATE TABLE my_table ( id NUMBER, name VARCHAR2(100) ) PCTFREE 10 PCTUSED 40 FREELISTS 2;
3. ASSM 和 MSSM 的区别
特性 | 自动块空间管理 (ASSM) | 手动块空间管理 (MSSM) |
---|---|---|
管理方式 | 自动管理空闲空间 | 使用空闲列表手动管理空闲空间 |
空间管理机制 | 位图,减少碎片化 | 空闲列表,可能导致碎片化 |
性能影响 | 更高效,减少空间浪费 | 性能可能受到空闲列表操作影响 |
适用场景 | 适用于频繁的数据插入、更新和删除 | 适用于静态数据或较少变动的数据 |
Oracle 版本支持 | Oracle 10g 及以后的版本默认使用 | Oracle 10g 之前的版本默认使用 |
管理难度 | 低,自动化管理 | 高,可能需要手动优化和维护 |