Oracle中的存储层次体系如下:
(1) 数据库由一个或多个表空间组成。
(2) 表空间由一个或多个数据文件组成。这些文件可以是文件系统中的cooked文件、原始分区、ASM管理的数据库文件,或集群文件系统上的文件。表空间包含段。
(3) 段(TABLE、INDEX等)由一个或多个区段组成。段在表空间中,但是可以包含这个表空间中多个数据文件中的数据。
(4) 区段是磁盘上一组逻辑连续的块。区段只在一个表空间中,而且总是在该表空间内的一个文件中。
(5) 块是数据库中最小的分配单位,也是数据库使用的最小I/O单位。
注:
表 空间是一个容器,其中包含有段。每个段都只属于一个表空间。一个表空间中可能有多个段。一个给定段的所有区段都在与段相关联的表空间中。段绝对不会跨越表 空间边界。表空间本身可以有一个或多个相关的数据文件。表空间中给定段的一个区段完全包含在一个数据文件中。不过,段可以有来自多个不同数据文件的区段。 表空间如图3-3所示。
图3-3 这个表空间包含两个数据文件、3个段和4个区段
图3-3显示了一个名为USER_DATA的表空间。其中包括两个数据文件:user_data01和user_data02。并分配了3个段:T1、T2和I1(可能是两个表和一个索引)。这个表空间中分配了4个区段,每个区段表示为逻辑上连续分配的一组数据库块。段T1包括两个区段,分别在不同的文件中。段T2和I1都各有一个区段。如果这个表空间需要更多的空间,可以调整已经分配给表空间的数据文件的大小,或者可以再增加第三个数据文件。
表空间是Oracle中的逻辑存储容器。作为开发人员,我们会在表空间中创建段,而绝对不会深入到原始的“文件级”。我们可不希望在一个特定的文件中分配区段(当然这也是可以的,但我们一般都不会这么做)。相反,我们会在表空间中创建对象,余下的工作都由Oracle负责。如果将来某个时刻DBA决定在磁盘上移动数据文件,从而使I/O分布得更均匀,这对我们来说没有任何关系,它根本不会影响我们的处理。