当前位置: 首页 > article >正文

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 中,PCTFREEPCTUSEDFREELISTS 是用于手动块空间管理(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 之前的版本默认使用
管理难度低,自动化管理高,可能需要手动优化和维护


http://www.kler.cn/a/411628.html

相关文章:

  • Spring Boot中配置Flink的资源管理
  • 小程序基础:流程。
  • 计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js
  • STL容器1
  • 所有位运算 详解
  • EXTI配置流程 含中断延时消抖点亮小灯
  • 音视频相关的一些基本概念
  • 前后端分离,后端拦截器无法获得前端请求的token
  • 快速理解微服务中Ribbon的概念
  • 01.Django快速入门
  • Redis核心类型----有序集合
  • 案例分析:嵌入式边缘计算机ARMxy在工商储能柜新能源应用
  • 租赁小程序|租赁系统搭建|租赁系统需求
  • React-useState的使用
  • redmi 12c 刷机
  • 【Linux】vim的使用
  • cuda conda yolov11 环境搭建
  • SSM框架整合
  • C#中面试的常见问题003
  • 11.19c++面向对象+单例模式
  • jupyter notebook的 markdown相关技巧
  • Vue 3 自定义插件开发
  • Http 响应协议
  • 【已解决】ensp启动报错“启动设备AR1失败”
  • 数字ic设计bug:寄存器翻转错误
  • Unity项目性能优化列表