目录
存储结构
数据文件为*.DBF
数据库由一个或多个表空间组成;
每个表空间由一个或多个数据文件组成;
每个数据文件由一个或多个簇组成;
段是簇的上级逻辑单元,一个段可以跨多个数据文件;
簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
特殊系统表空间
1.SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引。SYSTEM 表空间又称为系统表空间。
2.ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
3.MAIN 表空间在初始化库的时候,就会自动创建一个大小为 128M 的数据文件 MAIN.DBF,以及一个 HMAIN 目录作为 HUGE 数据文件路径,因此 MAIN 表空间为混合表空间。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
4.TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
记录
DM 规定每条记录的总长度不能超过页面大小的一半。
数据页
一个数据页包含多条数据。数据页是达梦数据库最小的IO单元,即一次IO最少读一个数据页 。
有一个跟数据页相关的的参数FILLFACTOR,该值在创建表/索引时可以指定也可以修改数据库参数DEFAULT_FILLFACTOR 指定默认值。
FILLFACTOR 指定插入数据时数据页的充满程度,取值范围从 0 到100。默认值为 0,等价于 100,表示全满填充,未充满的空间可供页内的数据更新时使用。
插入数据时填充比例的值越低,可由新数据使用的空间就越多;更新数据时填充比例的值越大,更新导致出现的页分裂的几率越大;
因此update 和upsert 适用较多的场景需要特别注意这个参数!!!!!
数据簇
一个簇是连续的 16 或者 32 个数据页。
分配簇
当 DM 数据库的表空间为新的簇分配空闲空间时,首先在表空间按文件从小到大的顺序在各个数据文件中查找可用的空闲簇(即删除数据/索引后被释放的簇),找到后进行分配;如果各数据文件都没有空闲簇,则在各数据文件中查找空闲空间足够的,将需要的空间先进行格式化,然后进行分配;如果各文件的空闲空间也不够,则选一个数据文件进行扩充。
释放簇
当用户删除了表中所有记录时(truncate),DM 数据库仍然会为该表保留 1-2 个簇供后续使用。若用户使用 DROP 语句来删除表/索引对象,则此表/索引对应的段以及段中包含的簇全部收回,并供存储于此表空间的其他模式对象使用。
段
段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。
临时段
临时表空间(TEMP表空间)包含的段。可以为临时表空间规划独立的磁盘,段可以包含来自不同文件的簇。
除了临时表外,SQL执行的中间结果很可能用到临时段。如排序,如果排序无法在内存中完成,就需要用到临时段
回滚段
回滚表空间(ROLL表空间)包含的段。回滚段中保存了用于恢复数据库操作的信息。注意,回滚段是有大小限制的,太多小事务未commit或者执行了大事务,可能导致回滚段被撑满从而导致SQL失败