微观世界的层级之美深度解析Oracle数据块、区Extent与段Segment的层级关系一、开篇显微镜Oracle是如何存下一张表的二、全景层级图从表空间到数据块的四层架构三、核心概念逐层拆解从底层到顶层1.数据块Data BlockOracle的“原子单位”2.区Extent空间分配的“最小合同单位”3.段Segment数据对象的“物理化身”四、三层结构的完整关系链一张EMP表的诞生场景创建EMP表并插入数据五、块、区、段的五大核心区别六、自动段空间管理ASSM与传统管理的区别1.传统空间管理Manual Segment Space Management2.自动段空间管理ASSM - Automatic Segment Space Management七、常见问题与最佳实践1.问题一表空间空间足够但创建表失败2.问题二表有大量空闲空间但查询很慢3.问题三如何预估一个表需要多少空间八、总结记住这个“书”的类比就够了The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇一、开篇显微镜Oracle是如何存下一张表的当你执行CREATE TABLE emp (...)时Oracle并不是简单地把数据丢进一个文件里而是按照一套极其精密的“三层存储结构”将数据层层封装最终落盘到数据文件中。这套三层结构就是段Segment→ 区Extent→ 块Block如果说表空间是“书架”数据文件是“书架的隔层”那么段就是“一本书”区是“一章”块是“一页纸”。今天这篇文章带你从“一本书”的视角彻底拆解Oracle存储结构的微观世界。二、全景层级图从表空间到数据块的四层架构先通过一张架构图看清表空间、段、区、块之间的完整层级关系物理映射逻辑存储结构数据库 Database表空间 SYSTEM表空间 USERS段 Segment-EMP表段 Segment-EMP_ID_IDX索引区 Extent 1-8个连续块区 Extent 2-8个连续块区 Extent 3-128个连续块区 Extent N...区 Extent 1区 Extent 2块 Block 1-8KB块 Block 2-8KB块 Block 3-8KB块 Block ...数据文件 users01.dbf数据文件 users02.dbf关键解读蓝色数据库顶层容器一切的开端。橘色表空间逻辑分区段的家园。红色段数据对象的空间占用实体。绿色区段分配空间的最小单位。紫色块Oracle I/O的最小单位。三、核心概念逐层拆解从底层到顶层1.数据块Data BlockOracle的“原子单位”精确描述数据块是Oracle数据库中最小的存储单位和I/O单位。无论你查询一行数据还是百万行数据Oracle都是从磁盘读取整个块到内存不会只读一行。数据块的核心参数参数说明典型值块大小DB_BLOCK_SIZE标准块大小数据库创建时指定8KBOLTP/ 32KBOLAP块头Block Header存储块地址、块类型、事务信息约100字节表目录Table Directory存储该块中有数据的表的信息动态变化行目录Row Directory存储该块中每行的偏移地址动态变化空闲空间Free Space可用于插入新行或更新行动态变化行数据Row Data实际存储的表行数据数据的主体数据块的空间管理参数-- 查看数据库块大小SHOWPARAMETER db_block_size;-- 查看表的块空间使用情况SELECTtable_name,blocks,empty_blocks,avg_spaceFROMdba_tablesWHEREtable_nameEMP;PCTFREE与PCTUSED控制块空间使用的两个关键参数PCTFREE预留的空间百分比用于行更新时扩展。默认10%。PCTUSED块使用率低于此值时重新允许插入。默认40%。块是Oracle一切操作的基础锁的最小粒度是行但读的最小粒度是块。2.区Extent空间分配的“最小合同单位”精确描述区是Oracle为段分配空间的最小单位由连续的数据块组成。当一个段需要更多空间时Oracle不会逐个块地分配而是按区分配一次给一组连续的块。区的核心特征连续性区内的所有块在数据文件中是物理连续的。大小可变区的初始大小和后续大小可以不同。按需增长段空间用完时自动分配新区。区的分配策略-- 创建表时指定区的分配策略CREATETABLEemp(emp_id NUMBER,name VARCHAR2(100))STORAGE(INITIAL64K-- 初始区大小NEXT64K-- 下一个区大小MINEXTENTS1-- 最少区数MAXEXTENTS100-- 最多区数PCTINCREASE0-- 区大小增长率);查看对象的区分配情况-- 查看EMP表的区分配SELECTextent_id,file_id,block_id,blocks,bytes/1024ASsize_kbFROMdba_extentsWHEREsegment_nameEMPANDownerSCOTTORDERBYextent_id;区的分配示例区编号起始块块数大小何时分配Extent 0Block 100864KB创建表时Extent 1Block 256864KB前8个块用完后Extent 2Block 5121281MB数据量增大后区是Oracle管理空间分配的“批处理”机制减少了逐个块分配的开销。3.段Segment数据对象的“物理化身”精确描述段是Oracle中占用存储空间的数据库对象。每一个有实际数据的表、索引、物化视图、簇等都对应一个段。段是区的集合区是块的集合。段的核心特征对象级实体一个表 一个段一个索引 一个段。空间持有者段是真正占用数据文件空间的实体。不可跨表空间一个段的所有区必须在同一个表空间内。常见段类型序号段类型对应对象说明1TABLE普通表、分区表存放表的数据行2INDEXB树索引、位图索引存放索引的键值和ROWID3UNDO回滚段存放修改前的旧值用于回滚和读一致性4TEMPORARY临时段排序、哈希连接产生的临时空间5LOB大对象列存放CLOB、BLOB的大数据查看段信息-- 查看SCOTT用户下所有段SELECTsegment_name,segment_type,tablespace_name,blocks,bytes/1024/1024ASsize_mbFROMdba_segmentsWHEREownerSCOTTORDERBYbytesDESC;四、三层结构的完整关系链一张EMP表的诞生让我们通过一个完整的实例追踪一张表从创建到数据增长是如何使用三层存储结构的场景创建EMP表并插入数据步骤一创建表生成段CREATETABLEemp(emp_id NUMBERPRIMARYKEY,name VARCHAR2(100),salary NUMBER)TABLESPACEusers;发生了什么在USERS表空间中创建一个名为EMP的段SEGMENT。段类型为TABLE。分配第一个区Extent 0包含8个连续块每个8KB。此时段总大小 64KB。步骤二插入少量数据使用第一个区INSERTINTOempVALUES(1,张三,5000);INSERTINTOempVALUES(2,李四,6000);发生了什么数据写入Extent 0的第一个块Block 1。每个块8KB一行数据约100字节一个块可存约80行。此时段仍只占用1个区64KB。步骤三大量插入数据触发新区分配-- 插入10万行数据BEGINFORiIN1..100000LOOPINSERTINTOempVALUES(i,员工||i,5000i);ENDLOOP;COMMIT;END;发生了什么Extent 0的8个块很快被填满。Oracle自动分配Extent 1又8个块64KB。数据继续增长分配Extent 2可能升级到128个块1MB。随着数据量增大后续区的块数越来越多。EMP段现在由多个区组成每个区由连续块组成。步骤四创建索引生成另一个段CREATEINDEXidx_emp_nameONemp(name)TABLESPACEusers;发生了什么在USERS表空间中创建另一个名为IDX_EMP_NAME的段SEGMENT。段类型为INDEX。这个段也有自己的区链和块链。EMP表和IDX_EMP_NAME索引是两个独立的段各自管理空间。五、块、区、段的五大核心区别序号对比维度数据块Block区Extent段Segment1层级定位最底层原子单位中间层空间分配单位最顶层数据对象实体2大小固定通常8KB可变64KB~几百MB可变几KB~几TB3连续性单个块不涉及连续区内所有块必须连续段内各区可以不连续4对应关系1个区 N个连续块1个段 N个不连续的区1个对象 1个段通常5分配时机写入数据时使用段空间不足时按需分配创建对象时立即分配第一个区六、自动段空间管理ASSM与传统管理的区别1.传统空间管理Manual Segment Space Management特征使用PCTFREE、PCTUSED、FREELISTS参数手动管理。通过空闲列表Freelist跟踪可用的块。高并发插入时Freelist争用成为性能瓶颈。2.自动段空间管理ASSM - Automatic Segment Space Management特征使用位图Bitmap跟踪块的使用状态。无需PCTUSED、FREELISTS参数。并发插入性能大幅提升是Oracle 10g后的默认方式。创建ASSM表空间CREATETABLESPACEassm_tbs DATAFILE/u01/oradata/ORCL/assm_tbs01.dbfSIZE100M EXTENT MANAGEMENTLOCALAUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO;-- 关键AUTO表示使用ASSM查看表空间是否使用ASSMSELECTtablespace_name,segment_space_managementFROMdba_tablespaces;七、常见问题与最佳实践1.问题一表空间空间足够但创建表失败原因段的第一个区无法分配足够的连续块。解决整理表空间碎片合并空闲空间。-- 合并空闲空间ALTERTABLESPACEusersCOALESCE;-- 查看表空间的碎片情况SELECTtablespace_name,COUNT(*)ASfragments,SUM(bytes)/1024/1024ASfree_mbFROMdba_free_spaceGROUPBYtablespace_name;2.问题二表有大量空闲空间但查询很慢原因大量DELETE操作导致块内碎片高水位线未下降。解决重组表降低高水位线。-- 方式一移动表ALTERTABLEemp MOVE;-- 方式二收缩表Oracle 10gALTERTABLEempENABLEROWMOVEMENT;ALTERTABLEemp SHRINK SPACECASCADE;-- 重建索引MOVE后索引失效ALTERINDEXidx_emp_name REBUILD;3.问题三如何预估一个表需要多少空间估算公式表占用空间 行数 × 平均行长度 × (1 PCTFREE/100) 段占用空间 表占用空间 索引占用空间 所需块数 CEIL(段占用空间 / (块大小 × 可用空间比例)) 所需区数 根据区的分配策略动态分配-- 查看表的平均行长SELECTtable_name,avg_row_len,num_rows,blocksFROMdba_tablesWHEREtable_nameEMP;八、总结记住这个“书”的类比就够了【段是一本书区是一章块是一页】段Segment- 一本书一个表就是一本完整的书包含所有内容。区Extent- 一章书的内容分章节每一章由连续的页码组成。块Block- 一页每一页有固定大小是阅读和翻页的最小单位。当书的内容增多插入数据作者会申请新的纸张分配新区。每张纸可以写固定字数的内容每个块可存固定数量的行。如果书的内容被大量删除DELETE纸张会出现空白碎片需要通过收缩SHRINK来释放多余的纸张。理解了段、区、块的三层结构你就掌握了Oracle存储管理的微观世界。下次当有人问你“表空间里到底存了什么”你可以自信地回答表空间存的是段段由区组成区由块组成块里面才是真正的一行行数据。你在日常运维中是否遇到过因为段碎片导致的空间浪费或者因为区分配策略不当导致的性能问题欢迎在评论区分享你的实战经验。The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆