dm数据库为数据库中所有对象分配逻辑空间,并存放到数据文件中。在达梦数据库内部,所有的数据文件组合在一起,被划分到一个或多个表空间中。同时,表空间被进一步划分为段、簇和页(也称为块)。通过这种细分可以使得数据库能够更加高效的控制磁盘空间的利用率。如图所示为这些数据结构之间的关系。
由图可看出,达梦数据库的数据结构如下:
a. 数据库由多个表空间构成
b. 每个表空间由一个或多个数据文件构成
c. 每个数据文件由一个或多个簇组成
d. 段是簇的上层逻辑单元,段可以跨数据文件存在
e. 簇是由磁盘上连续的页组成的,簇不可跨数据文件存在
f. 页是数据库中最小的分配单位,也是数据库中使用的最小的io单元
1. 表空间
在dm数据库中,表空间由一个或多个数据文件组成。DM数据库中所有的对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。
在创建数据库实例的时候,会自动创建5个默认表空间:MAIN表空间,TEMP表空间,HMAIN表空间,SYSTEM表空间,ROLL表空间。
a. MAIN表空间,创建用户时,如果没有指定默认表空间,系统就会自动指定MAIN为用户的默认表空间。
b. TEMP表空间,由DM数据库自动维护。当用户的sql语句需要磁盘空间来完成某个操作时,dm会从temp表空间分配临时段。
c. HMAIN表空间,由dm数据库自动维护,当用户创建HUGE表时,未指定HTS表空间的情况下,充当默认HTS表空间。
d. SYSTEM表空间,存放了有关dm数据库的元数据信息,用户不能在SYSTEM表空间上建表和索引。
e. ROLL表空间,由dm数据库自动维护。该表空间用于存放事务执行过程中执行DML操作之前的值,从而为访问该表的其它用户提供表数据的读一致性视图。
每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM,SYSDBA 的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。如果用户在创建表的时候,指定了与默认表空间不一致的另一个表空间时,表存在所指定的表空间中,默认在该表创建的索引也是存在该表空间中,但是该用户的默认表空间不会发生变化。、
2. 记录
数据库中的每一行是一条记录。在DM中,除了huge表,其它的表都是在数据页中按记录存储数据的。也就是说记录是存储在数据页中的,记录并不是dm数据库的存储单位,页才是。而由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。除此之外,数据页还包含了页头控制信息等空间,因此dm规定每条记录的总长度不能超过页大小的一半。
3. 页
数据页是DM数据库中最小的存储单元。页的大小对应磁盘上特定的存储字节,用户在创建数据库时可以指定,默认为8kb,一旦创建好了数据库,页大小就不能被改变。
4. 簇
簇是页的上层逻辑单元,由同一个数据文件中16个或32或64个连续的页组成。在dm数据库中,簇的页数由用户在创建数据库时指定,默认页数为16,与页的大小一样,一旦创建好数据库,簇的大小就不能再修改。
当创建一个表/索引的时候,dm为表/索引的数据段分配至少一个簇,同时数据库会自 动生成对应数量的空闲数据页,供后续操作使用。如果初始分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,dm数据库将自动分配新的簇。在缺省情况下,dm数据库在创建表/索引时,初始分配一个簇,当初始分配的空间用完时,dm数据库会自动扩展。
5. 段
段是簇的上层逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不同数据文件的簇。由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。
a. 数据段
段可以被定义成特定的对象的数据结构,如表数据段或索引数据段。dm以簇为单位给每个数据段分配空间,当数据段的簇空间完全用完时,dm数据库就给该段重新分配簇。段的分配和释放完全数据库自动完成,可以在创建对象时设置参数来决定数据段的簇如何分配。
b. 临时段
所有的临时段都在temp表空间中,这样可以分流磁盘设备的io,也可以减少由于在其它表空间频繁创建临时数据段而造成的碎片。
当处理一个查询时,经常需要为sql语句的解析与执行的中间结果准备临时空间。dm数据库会自动地分配临时段的磁盘空间,用户不能手工进行干预。
c. 回滚段
dm数据库在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。对于未提交事务,当执行回滚语句时,回滚记录被用来做回滚变更。在数据库恢复阶段,回滚记录被用来做任何未提交变更的回滚。在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询。