最近因工作需要,需要理解oracle单表容量问题,所以,对oracle存储体系进行了学习归纳,图示:

 

其中块的结构图如下:

 

 

块首部(block header)包含块类型的有关信息(表块、索引块等)、块上发生的活动事务和过去事务的相关信息(仅事务管理的块有此信息,例如临时排序块就没有事务信息),以及块在磁盘上的地址(位138/ 849置)。块中接下来两部分是表目录和行目录,最常见的数据库块中(即堆组织表的数据块)都有这两部分。如果有表目录(table directory),则其中会包含把行存储在这个块上的表的有关信息(可能一个块上存储了多个表的数据)。行目录(row directory)包含块中行的描述信息。这是一个指针数组,指向块中数据部分中的行。块中的这3 部分统称为块开销(block overhead),这部分空间并不用于存放数据,而是由Oracle 用来管理块本身。块中余下的两部分就很清楚了:块上可能有一个空闲空间(free space),通常还会有一个目前已经存放数据的已用空间(used space)。

 

从以上图以及块信息,归纳下以下几点:

 

1.数据库由一个或者多个表空间组成

2.表空间物理上由一个或者多个文件组成,此文件可以是os文件系统中、 裸设备、ASM文件系统、集群文件系统中的文件

3.表空间逻辑上由段组成

4.段逻辑上由一个或者多个区段组成

5.每个段在物理上可以存储在一个文件或者多个文件上

6.一个区段数据物理上只能存储在一个文件上,区段在文件系统里面是连续的区间(逻辑上),但实际在硬盘上可能不是连续的

7.块是最小单位,由文件系统保证,同时也是数据库IO时的最小单元

8.创建对象(表 索引等)时,会创建一个或者多个段,这些段可能分布在一个表空间也可能分布在多个表空间

9.单表的最大容量,理论上可以达到文件系统可以寻址和存储的上限