这里是数据文件存放数据之处,也是数据库存在的根本。不过这样的数据文件让我们使用者感觉无从下手了解,好像黑盒子一样。但是只要正确认识和剖析Oracle的体系逻辑结构,就可以让我们进一步加深对Oracle数据库的了解,不在是停留在黑盒子的认识水平,从而工作起来游刃有余。
这里要隆正介绍的体系逻辑结构是:表空间(TABLESPACE)、段(SEGMENT)、区(EXTENT)、块(BLOCK)。ORACLE SERVER正是条理地通过表空间以及段、区、块控制磁盘空间的合理高效的使用,观察一下图:
从图中我们不难看出,数据库(DATABASE)由若干个表空间(TABLESPACE)组成,表空间由若干个段(SEGMENT)组成,段由若干个区(EXTENT)组成,区又是由Oracle的最小单元块(BLOCK)组成。
其中表空间又包含系统表空间、回滚段表空间、临时表空间、用户表空间。除了用户表空间外其他三种表空间有各自特定的用途,不可随意更改和破坏,尤其是系统表空间更是需要谨慎的保护。
从小到大来说,一系列连续的BLOCK组成了EXTENT,一个或多个EXTENT组成了SEGMENT,一个或多个SEGMENT组成了TABLESPACE,而一个或多个TABLESPACE组成了DATABASE(一个DATABASW要想存在,至少需要哟SYSTEM及UNDO表空间)。
我们新建的表其实是和段(SEGMENT)直接对应,其中T表就是T段,T2表就是T2段,T3表就是T3段(不过要注意,其实表并不是只对应一个段,如表中包含LOB类型列,则LOB至少会有两个段,数据段和索引段,如表有分区,则每个分区又都独立成段)。
如果建表的命令如下:
create table t1(id int) tablespace tbs_text;
create table t2(id int) tablespace tbs_text;
create table t3(id int) tablespace tbs_text;
那显而易见t1段,t2段,t3段都属于 tbs_text表空间。
假如一个区有固定是由10个数据块组成的,我们插入t表的动作就是这样的:
数据插入某个区EXTENT1的第1个数据块中,很快就插满了,然后就插入第2个同属于该EXTENT1区的数据块中,接下来第2个又插满了,插第三个...当准备插入第11个数据块的时候,这个区满了。接下来只好插入EXTENT2区,直至插完EXTENT3、EXTENT4后,而这些EXTENT1、EXTENT2、EXTENT3、EXTENT4组成了T段,也就是T表。
Oracle的这个EXTENT的设计师为了避免过度扩展,因为块的尺寸太小了,如果以块的尺寸为单位进行扩展,Oracle数据库的运行就会变得很慢。
下面我从Oracle逻辑结构的最小单位数据块BLOCK说起:
虽然说BLOCK是Oracle的最小逻辑数据单位,但是所有数据在文件系统层面的最小物理存储单位是字节,操作系统也有一个类似Oracle的块容量的参数(block size),但是Oracle总是访问整个Oracle BLOCK,而不是按照操作系统的 block size来访问的。
一般情况下大多数操作系统OS的块容量为512字节大小或其整数倍,而数据库块一般默认设置为8KB,除此之外也有系统将其设置为2KB、4KB、16KB、32KB、64KB等其他大小,但是数据库的BLOCK一般要设置为操作系统OS块容量的整数倍,这样可以减少IO操作。
Oracle的数据库块并不是简单地往里插数据,插满了装不下就插入到另一个数据块这么简单,而是额外提供了一定的管理功能。数据块的组成分为数据块头(包含标准内容和可变内容)、表目录区(table directory)、行目录区(row directory)、可用空间区(free space)、行数据区(row data)、这5个部分,具体如图:
数据块分成了5个部分:
1. 数据块头(header)中包含了此数据块的概要信息,例如块地址(block address)及数据块所属的段的类型(比如到底是表还是索引).
2. 表目录存放了什么呢?只要有一行数据插入到数据库块中,那该行数据所在的表的信息被存储在这个区域。
3. 行目录存放什么呢?其实就是存放你插入的行的地址。
4. 可用空间区说来就简单了,就是块中的空余空间,为什么要有空余呢?这个空余的多少由Oracle的pctfree参数设置,如果是10,该块将会空余10%左右的空间。此外如果是表或者索引块,该区域还会存储事务条目,大致有23字节左右开销。
5. 而行数据区域就更简单了,就是存储具体的行的信息或者索引的信息,这部分占据了数据块绝大部分的空间。
这里数据块头、表目录区、行目录区被统称为管理开销,其中有些开销的容量是固定的,而有些开销的总容量是可变的,数据块中固定及可变管理开销的容量平均在84到107字节之间。
我们把一些连续的数据块组合在一起,就形成了区(EXTENT),Oracle中这个被称之为EXTENT的数据库逻辑存储分配单位就是这么形成的。
EXTENT是Oracle数据库分配空间的最小单位,请注意分配这两个字眼。