本文只讨论使用文件方式来存储数据的情况,对于采用裸设备及其它方式还没有接触, 或许以后会有时间了解一下. 这里所说的存储的数据是指表记录数据以及索引数据.
Oracle用来存储数据的文件称为数据文件(Data file), 这个数据文件就对应操作系统中的文件. 大多数的小型数据库会使用单文件来保存数据库的所有数据. 这样会有一个限制, 就是文件的大小有能超过操作文件大小的最大值(这个值和操作系统地址位数有关), 当然在64位机上可能不算一个限制.
Oracle 做为一个大型数据库, 而且常采用单数据库多方案工作模式, 其数据存储容量可能很容易就会达到其上限, 因而Oracle采用多个文档来保存数据, 为降低表(table)确定存储位置的复杂性, Oracle用表空间(tableSpace)来管理这些文件的总体存储空间.
一个表空间包含至少一个文件, 一个文件只能属于一个表空间, 组成表空间文件的总大小就是表空间的大小. 因而表空间大小也可以增长, 有两种方式:
a. 增加新的文件到表空间中.
b. 增加属于表空间的文件的大小.
Oracle 支持为表和索引指定存储位置(即表空间). 使用段(Segment) 来表示表或索引的所有的存储空间. 存储表数据的段叫数据段(Data Segment), 存储索引数据的段叫索引段(Index Segment).
随着表记录的增长, 会要更多的空间来存储数据. 这就涉及到是一次就为段分配一个很大空间来满足未来的需要, 还是在不空间不足时增加其空间呢? 显然要采用后一种方式. 另一个问题是在需要追加空间时, 要加多少呢?
Oracle 采用另外两种结构来处理这种需求, 一个较小单位叫数据块(Data Block), 和一个较大结构数据扩展(Data Extent). 数据块是Oracle 的基本I/O(输入/输出)单位, 一般设为操作系统I/O单位的整数倍 ----为什么要设成这样自己体会一下. 数据数据扩展是数据块的整数倍, 用于数据段需要扩展时增加的容量. 这个值是多大呢, 对于不同的表一般不一样, 也是可以通参数来设置.
当用户创建数据表时,Oracle为此表的数据段分配一个包含若干数据块的初始数据扩展(initial extent)。虽然此时数据表中还没有数据,但是在此初始数据扩展中的数据块已经为插入新数据做好了准备。
如果一个段的初始数据扩展中的数据块都已装满,且有新数据插入需要空间时,Oracle自动为这个段分配一个增量数据扩展(incremental extent)。增量数据扩展是一个段中继已有数据扩展之后分配的后续数据扩展,她的容量大于或等于之前的数据扩展。因而数据块, 扩展, 段的关系类似于如下图:
随着记录不断增多, 表及索引需要追加数据扩展, 表空间也要增加新文件来增大容量因此, 表数据在表空间及文件中的存储关系类似下图:
附: 本文图片来自于oracle concepts文档
参考资料
Oracle concepts 10g 中文版R2 http://www.zw1840.com/oracle/translation/concepts