达梦数据库体系架构-逻辑结构

当前国内数据库的整体环境在逐渐摆脱对Oracle数据库的过度依赖,国产数据库也如雨后春笋一般,遍地开花,借着这股春风,开始接触了一段时间的达梦数据库,为了方便学习记忆,遂将随手笔记整理。

数据库和实例

数据库

DM数据库指的是磁盘上存放在DM数据库中的数据的集合,一般包括:

数据文件
	日志文件
	控制文件
	临时数据文件等

实例

实例一般包含:一组正在运行的DM后台进程/线程和一个大型的共享内存。

实例是操作DM数据库的手段,用来访问数据库的内存结构以及后台进程的集合。

数据库与实例的关系

(1)DM数据库存储在服务器的磁盘上;
	(2)DM实例存储于服务器的内存中;
	(3)实例操作数据库的内容;
	(4)任何时候,一个实例只能与一个数据库进行关联(装载、打开或者挂起数据库)
	(5)大多数情况下,一个数据库也只有一个实例对其操作。
	(6)DM共享存储集群(DMDSC),类似Oracle的RAC,多个实例可以同时装载并打开同一个数
		据库(位于多台服务器共享的磁盘上)

DM逻辑存储结构

(1)DM数据库为所有对象分配逻辑空间,并存放在数据文件中。
(2)所有的数据文件被划分到一个或者多个表空间,所有对象都村昂在这些表空间中。
(3)表空间被进一步细化段、簇(块)。其目的为高效控制磁盘空间利用率。

	数据库	->多个表空间组成
	表空间	->多个数据文件组成
	数据文件->多个段组成
	段		->多个簇组成,是簇的上级逻辑单元,一个段可以跨多个数据文件。
	簇		->磁盘上连续的页组成,一个簇总是在一个数据文件中。
	页		->最小的分配单元,最小的IO单元。同Oracle中的Block。

表空间

(1)DM数据库的所有对象,逻辑上存放在表空间实际都是存储在数据文件中。
	(2)安装数据库时,自动创建
		SYSTEM表空间,存放字典信息,用户不能在其上创建表和索引。
		ROLL表空间,DM自动维护,无需干涉。存放DML操作前的数据值。与Oracle的UNDO功能一致。
		MAIN表空间,默认大小128M,用户的默认表空间,与Oracle的USER功能一致。
		TEMP表空间,DM自动维护。需要磁盘空间完成SQL操作时使用。
			创建索引;
			无法在内存完成的order by操作;
			SQL语句的中间结果集;
			用户创建的临时表。
		HMAIN表空间,属于HTS表空间,DM自动维护,无需干涉。创建HUGE表时的默认表空间。
		
	(3)默认表空间分配
		1)SYS、SYSSSO、SYSAUDITOR的默认表空间是SYSTEM。
		2)SYSDBA默认表空间是MAIN。
		3)未指定默认表空间的新用户默认表空间为MAIN。
		4)建表时指定了表空间,默认索引也创建在该指定的表空间上。
		5)建议用户创建新表空间存放业务数据。
			用户可以通过执行如下语句来查看表空间相关信息。
			SYSTEM、ROLL、MAIN 和 TEMP 表空间查看语句:
			SELECT * FROM V$TABLESPACE;
			HMAIN 表空间查看语句:
			SELECT * FROM V$HUGE_TABLESPACE;

记录

(1)表中每一行即为一条记录。
	(2)记录存储在数据页中,不能跨页存储,长度受到数据页大小的限制。
	(3)记录的总长度不能查过页面大小的一半。

(1)DM数据库中最小的存储单元,数据库的整个生命周期内,页大小都不能改变。
	(2)页大小的划分
		4K
		8K,默认大小,单个数据文件最大32GB;
		16K
		32K,建议设置大小值
	(3)数据页结构
		页头存放控制信息:包含页类型、页地址
		页的中部存放数据
		空闲空间
		页的尾部存放行偏移数组:专门留出空间存放;用于标识页上的空间占用情况,方便数据页的管理。
	(4)FILLFACTOR是DM提供的一个与性能有关的数据页级的存储参数。
		1)指定一个数据页初始化后插入数据时,最大使用空间的百分比。
		2)该参数在创建表、索引时指定使用。
		3)该参数值确定了数据页中:
			可用空间百分比(FILLFACTOR),来执行更多的INSERT操作;超过该百分比,数据分为两部分,
				存入在当前页和新页中;
			可扩展空间百分比(100-FILLFACTOR),为数据页保留一定的空间,避免更新操作中增加列或
				改变列长度而引起的数据页频繁分裂;
		4)该参数使用时需在空间和性能间进行权衡;
			值过高,导致在后续更新数据时,频繁引起页分裂,需要大量的IO操作;
			值适中,尽量避免数据页分裂,提示IO;

(1)数据页的上级逻辑单元,由同一个数据文件中,16个或32个或64个连续的数据页组成。
	(2)DM中,簇的大小在创建数据库时指定,默认16个页。
	(3)和数据页的大小一样,一旦创建好数据库,伺候该数据库的簇的大小就不能修改。
	
	1.2.4.1分配数据簇
		当创建一个表/索引时,DM为数据段分配至少一个簇,同时数据库会自动生成对应数量的空闲数据页,
			供后续使用。
		默认初始分配一个簇,用完后,DM会自动扩展。
		为新的簇分配空间时:
			优先在表空间中,按文件从小到大的顺序,查找可用的空闲簇,然后进行分配;
			若数据文件没有空闲簇,在数据文件中查找足够的空闲空间,然后格式化后,再进行分配;
			若文件的空闲文件不够,则选择一个数据文件进行扩充。
			
	1.2.4.2释放数据簇
		用户delete或truncate表/索引对象中的记录时,DM通过修改数据文件中的位图来释放簇;
		释放后的簇被视为空闲簇,可供其他对象使用;
		当用户delete或truncate表/索引的所有记录时,DM仍会保留1-2个簇供后续使用;
		当对表/索引进行DROP操作时,此时该对象包含的段以及段内的簇将全部回收。
		对于临时表空间,DM数据库会自动释放在执行SQL过程中产生的临时段,并将对应的簇还给临时表空间;
		临时表空间文件在磁盘所占大小并不会因此缩减,可通过SF_RESET_TEMP_TS函数清理磁盘空间。
		
		对于回滚表空间,DM会定期检查回滚段,并确定是否需要在回滚段中释放簇。

段是簇的上级逻辑分区单元,由一组簇组成。
	同一个表空间,段可以包含来自不同数据文件的簇,即一个段可以跨越不同的文件。
	一个簇以及该簇所包含的数据页只能来自一个数据文件;
	因为簇按需分配,所以数据段中不同的簇之间,在磁盘上不一定连续。
	
	1.2.5.1数据段
		段可以被定义成特定对象的数据结构,比如表数据段、索引数据段。
			表中的数据以表数据段结构存储;
			索引中的数据以索引数据段结构存储;
		DM以簇为单位为数据段进行空间分配;
		段的分配和释放由DM自动完成,可以在创建表/索引时设置存储参数来决定数据段的簇如何分配。
		
		表与索引的存储参数来决定对应数据段的簇如何被分配,该参数会影响相关数据段的存储与访问效率。
		分区表,每个分区段使用单独的数据段;
		分区表上的非分区索引使用一个索引数据段来容纳所有数据;
		分区索引,每个分区使用一个单独索引数据来容纳其数据。
		表的数据段和与其相关的索引不一定要存储在同一个表空间中。
		
	1.2.5.2临时段
		所有的临时段都创建在临时表空间中;
			可以分流US河北的IO;
			也可以减少在其他表空间创建临时段而造成的碎片
		临时段分配和释放完全都系统自动控制,用户不能进行手工干预。
		
	1.2.5.3回滚段
		数据库需要尽可能长时间保存回滚信息,用于长时间进行查询操作,以备需要早期回滚信息来生成
			早期数据页镜像。