达梦数据库-DM8体系结构介绍(超详细)

文章目录

DM8体系结构介绍

一.DM逻辑结构概述

1.1数据库

1.2实例

二.DM逻辑存储结构

2.1页

2.2簇

2.3段

2.3.1.数据段

2.3.2. 临时段

2.3.3. 回滚段

2.4记录

2.5表空间

三.DM物理存储架构

3.1配置文件

3.1.1 dm.ini

3.1.2 dmmal.ini

3.1.3 dmarch.ini

3.1.4 dm_svc.conf

3.1.5 sqllog.ini

3.1.6其他

3.2控制文件

3.3数据文件

3.3.1 B 树数据

3.3.2 堆表数据

3.3.3 列存储数据

3.3.4 位图索引

3.4重做日志文件

3.5归档日志文件

3.6备份文件

3.7跟踪日志文件

3.8事件日志文件

四.DM内存结构

4.1内存池

通过参数查看内存:0 表示无限制

4.2缓冲区

4.2.1 数据缓冲区

4.2.2日志缓冲区

4.2.3字典缓冲区

4.2.4 SQL缓冲区

4.3排序区

4.4哈希区

4.5 SSD缓存区

五. DM线程结构

5.1 监听线程

5.2 工作线程

5.3 IO线程

5.4调度线程

5.5 日志FLUSH线程

5.6日志归档线程

5.7日志APPLY线程

一.DM逻辑结构概述

1.1数据库

在有些情况下,数据库的概念包含的内容会很广泛。如在单独提到 DM 数据库时,可能 指的是 DM 数据库产品,也有可能是正在运行的 DM 数据库实例,还可能是 DM 数据库运行中 所需的一系列物理文件的集合等。但是,当同时出现 DM 数据库和实例时,DM 数据库指的是 磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。

1.2实例

实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。简单来说,实例就是操作 DM 数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。

DM 数据库存储在服务器的磁盘上,而 DM 实例则存储于服务器的内存中。通过运行DM 实例,可以操作 DM 数据库中的内容。在任何时候,一个实例只能与一个数据库进行关联(装 载、打开或者挂起数据库)。在大多数情况下,一个数据库也只有一个实例对其进行操作。但是在 DM 共享存储集群(DMDSC)中,多个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的物理磁盘上)。此时,我们可以同时从多台不同的计算机访问这个数据库。

实例 = 内存 + 后台单进程多线程

查看实例相关视图:

v$instance数据字典结构

v$process 数据字典

v$thread 数据字典:

查看实例版本

SQL> select db_version,svr_version from v$instance;

二.DM逻辑存储结构

根据上图可得知:

1.数据库有一个或多个表空间组成。

2.每个表空间有一个或多个数据文件组成。

3.每个数据文件有一个或多个簇组成。

4.段是簇的上级逻辑单元,一个段可以跨多个数据文件。

5.簇由磁盘上连续的页组成,一个簇总是在一个数据文件中。

6.页是数据库中最小的分配单元,也是数据库中使用的最小的IO单元。

2.1

数据页(也称数据块)是DM数据库中最小的数据存储单元。可以类比与Oracle的块。

在DM数据库中,页大小可以为4KB、8KB、16KB或者32KB.一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能改变。

页头控制信息包含了关于页类型、页地址等信息。

行偏移数组用于标识页上的空间占用情况以便管理数据页自身的空间。

在绝大多数情况下,用户都无需干预DM数据库对数据页的管理。不过,DM数据库还是提供了选项供用户选择。对于普通表和索引DM8提供了一个用于管理数据页填充比例的存储参数:

填充比例FILLFACTOR:指定插入数据时数据页的可用空间百分比,取值范围从0到100(默认值为0,等价于100),其余的空间被称为可扩展空间。可扩展空间可供页内的数据更新时使用。插入数据时填充比例的值越低,可由新数据使用的空间就越多;更新数据时填充比例的值越大,更新导致出现的页分裂的几率越大。

当插入的数据占据的数据页空间百分比低于FILLFACTOR时,允许数据插入该页,否则将当前数据页中的数据分为两部分,一部分保留在当前数据页中,另一部分存入一个新页中。

为了提高更新数据的性能,可以设置一个相对较低(但不是过低)的FILLFACTOR值,使得后续执行更新操作时,可以尽量避免数据页的分裂,提升I/O性能,不过这是以牺牲空间利用率来换取性能的提高。

注意: io优化可以考虑: 数据库更新频繁时可以考虑减少其值 ,数据库批量读取时,可以考虑加大其值 

2.2簇

簇是数据页的上级逻辑单元,由同一个数据文件中16个或32个或64个连续的数据页组成。默认大小为16。一旦创建好数据库,此后该数据库的簇的大小就不能改变。可以类比与Oracle的区。

当创建一个表/索引的时候,DM为表/索引的数据段分配至少一个簇(默认一个),同时数据库会自动生成对应数量的空闲数据页。如果初始分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,DM数据库将自动分配新的簇。

对于创建普通表和索引,DM8提供了几个和簇的存储参数:

1.初始簇数目INITIAL:

建立表时分配的簇个数(默认为1),1<INITIAL<256

下次分配簇数目NEXT:

3.分配数据簇: 当创建一个表/索引的时候,DM 为表/索引的数据段分配至少一个簇,同时数据库会自动生成对应数量的空闲数据页,供后续操作使用。
4.释放数据簇: 对于用户数据表空间,在用户将一个数据段对应的表/索引对象 DROP 之前,该表对应的数据段会保留至少 1 个簇不被回收到表空间中。

2.3段

段是簇的上级逻辑分区单元,它由一组簇组成。
在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。

2.3.1.数据段

段可以被定义成特定对象的数据结构,如表数据段或索引数据段。表中的数据以表数据段结构存储,索引中的数据以索引数据段结构存储。DM 以簇为单位给每个数据段分配空间, 当数据段的簇空间用完时,DM 数据库就给该段重新分配簇,段的分配和释放完全由 DM 数据库自动完成,可以在创建表/索引时设置存储参数来决定数据段的簇如何分配。

当用户使用 CREATE 语句创建表/索引时,DM 创建相应的数据段。表/索引的存储参数 用来决定对应数据段的簇如何被分配,这些参数将会影响与对象相关的数据段的存储与访问 效率。对于分区表,每个分区使用单独的数据段来容纳所有数据,对于分区表上的非分区索 引,使用一个索引数据段来容纳所有数据,而对于分区索引,每个分区使用一个单独索引数 据段来容纳其数据。表的数据段和与其相关的索引段不一定要存储在同一表空间中,用户可

以在创建表和索引时,指定不同的表空间存储参数。

2.3.2. 临时段 

在 DM 数据库中,所有的临时段都创建在临时表空间中,这样可以分流磁盘设备的 I/O, 也可以减少由于在 SYSTEM 或其他表空间内频繁创建临时数据段而造成的碎片。 当处理一个查询时,经常需要为 SQL 语句的解析与执行的中间结果准备临时空间。DM 数据库会自动地分配临时段的磁盘空间。例如,DM 在进行排序操作时就可能需要使用临时段,当排序操作可以在内存中执行,或设法利用索引就可以执行时,就不必创建临时段。对于临时表及其索引,DM 数据库也会为它们分配临时段。

临时段的分配和释放完全由系统自动控制,用户不能手工进行干预。

2.3.3. 回滚段 

DM 数据库在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。对于未提交事务,当执行回滚语句时,回滚记录被用来做回滚变更。在数据库恢复阶段,回滚记录被用来 做任何未提交变更的回滚。在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询。DM 数据库提供了全自动回滚管理机制来管理回滚信息和回滚空间,自动回滚管理消除了管理回滚段的复杂性。此外,系统将尽可能保存回滚信息,来满足用户查询回滚信息的需要。事务被提交后,回滚数据不能再回滚或者恢复,但是从数据读一致性的角度出发,长时间运

行查询可能需要这些早期的回滚信息来生成早期的数据页镜像,基于此,数据库需要尽可能长时间的保存回滚信息。DM 数据库会收集回滚信息的使用情况,并根据统计结果对回滚信息保存周期进行调整,数据库将回滚信息保存周期设为比系统中活动的最长的查询时间稍长。

2.4记录

数据库表中的每一行是一条记录。在 DM 中,除了 HUGE 表,其他的表都是在数据页中按记录存储数据的。也就是说,记录是存储在数据页中的,记录并不是 DM 数据库的存储单位,页才是。由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此 DM 规定每条记录的总长度不能超过页面大小的一半。

2.5表空间

表空间有联机(ONLINE)和脱机(OFFLINE)两种状态。

系统表空间(SYSTEM)、回滚表空间(ROLL)、重做日志表空间和临时文件表空间(TEMP)不允许脱机,不允许修改数据缓冲区。

在DM数据库中,表空间由一个或者多个数据文件组成。DM数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。

在创建DM数据库时,会自动创建5个表空间:SYSTEM表空间、ROLL表空间、MAIN表空间、TEMP表空间和HMAIN表空间。

1.SYSTEM表空间存放了有关DM数据库的字典信息,用户不能在SYSTEM表空间创建表和索引。

2.ROLL表空间完全由DM数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行DML操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。

3.MAIN表空间在初始化库的时候,就会自动创建一个大小为128M的数据文件MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定MAIN表空间为用户默认的表空间。

4.TEMP表空间完全由DM数据库自动维护。当用户的SQL语句需要磁盘空间来完成某个操作时,DM数据库会从TEMP表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL语句中间结果集以及用户创建的临时表等都会使用到TEMP表空间。

5.HMAIN表空间属于HTS表空间,完全由DM数据库自动维护,用户无需干涉。当用户在创建HUGE表时,未指定HTS表空间的情况下,充当默认HTS表空间。

SYS、SYSSSO、SYSAUDITOR系统用户,默认的用户表空间是SYSTEM,

SYSDBA的默认表空间为MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定MAIN表空间为用户默认的表空间。

如果用户在创建表的时候指定了存储表空间A,并且和当前用户的默认表空间B不一致时,表存储在用户指定的表空间A中,并且默认情况下,在这张表上面建立的索引也将存储在A中,但是用户的默认表空间是不变的,仍为B。

用户可以通过执行如下语句来查看表空间相关信息。

SYSTEM、ROLL、MAIN 和 TEMP 表空间查看语句:

SELECT * FROM V$TABLESPACE;

HMAIN 表空间查看语句:

SELECT * FROM V$HUGE_TABLESPACE;

三.DM物理存储架构

典型的物理存储结

构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志

文件等

3.1配置文件

配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 ini 为扩 展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值来达成如下两个方面的

目标:

1. 启用/禁用特定功能项;

2. 针对当前系统运行环境设置更优的参数值以提升系统性能。

3.1.1 dm.ini

类似于oracle数据库的pfile文件

每创建一个DM数据库,就会自动生成dm.ini文件。dm.ini是DM数据库启动所必须的配置文件,通过配置该文件可以设置DM数据库服务器的各种功能和性能选项。

参数属性分为三种:静态、动态和手动。

静态,可以被动态修改,修改后重启服务器才能生效。

动态,可以被动态修改,修改后即时生效。动态参数又分为会话级和系统级两种。会话级参数被修改后,新参数值只会影响新创建的会话,之前创建的会话不受影响;系统级参数的修改则会影响所有的会话。

手动,不能被动态修改,必须手动修改dm.ini参数文件,然后重启才能生效。

动态修改是指DBA用户可以在数据库服务器运行期间,通过调用系统过程

SP_SET_PARA_VALUE()

SP_SET_PARA_DOUBLE_VALUE()

SP_SET_PARA_STRING_VALUE()

注意: 修改参数文件前, 确认需要修改的参数功能和影响, 参数的属性等信息.备份参数文件,一定要谨慎。

–查看参数信息
select * from v$dm_ini where “V$DM_INI”.PARA_NAME like UPPER(‘参数关键字’)||‘%’ ;

3.1.2 dmmal.ini

dmmal.ini是MAL系统的配置文件。需要用到MAL环境的实例,所有站点dmmal.ini需要保证严格一致。

MAL系统是DM内部高速通信系统,基于TCP/IP协议实现。服务器的很多重要功能都是通过MAL系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL系统内部包含一系列线程,有MAL监听线程、MAL发送工作线程、MAL接收工作线程等。

3.1.3 dmarch.ini

dmarch.ini用于本地归档和远程归档。配置项如下:

开启归档后的基本参数(本地归档):

3.1.4 dm_svc.conf

此文件中包含DM各接口及客户端需要配置的一些参数。在Linux平台下,此文件位于/etc目录。64位的DM安装在Win64操作平台下,此文件位于%SystemRoot%\system32目录;

如果对dm_svc.conf的配置项进行了修改,需要重启客户端程序,修改的配置才能生效。

dm_svc.conf配置文件的内容分为全局配置区和服务配置区。全局配置区在前,可配 置所有的配置项;服务配置区在后,以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区。

3.1.5 sqllog.ini

sqllog.ini用于sql日志的配置。当把INI参数SVR_LOG置为1,才会打开SQL日志。

如果在服务器启动过程中,修改了sqllog.ini文件。修改之后的文件,只要调用过程SP_REFRESH_SVR_LOG_CONFIG() 就会生效。

SVR_LOG(动态,系统级)是否打开SQL日志功能

0:表示关闭;

1:表示打开;

2:按文件中记录数量切换日志文件,日志记录为详细模式;

3:不切换日志文件,日志记录为简单模式,只记录时间和原始语句。

配置慢日志的参数文件:

3.1.6其他

dmrep.ini 用于配置复制实例,详见DBA手册“数据复制”章节

dmllog.ini 用于配置逻辑日志,详见DBA手册“数据复制”章节

dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。

3.2控制文件

每个 DM 数据库都有一个名为 dm.ctl 的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容:

1.数据库名称;

2.数据库服务器模式;

3.OGUID 唯一标识;

4.数据库服务器版本;

5.数据文件版本;

6.数据库的启动次数;

7.数据库最近一次启动时间;

8.表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;

9.控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。

/home/dmdba/dmdbms/bin/dmctlcvt type=1 src=/dm8/dmdata/DMDB/dm.ctl dest=/tmp/dmctl.txt

3.3数据文件

数据文件以 dbf 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方。可以在创建数据文件时通过 MAXSIZE参数限制其扩展量,当然,也可以不限制。

3.3.1 B 树数据 

行存储数据,也是应用最广泛的存储形式,其数据是按 B 树索引组织的。普通表、分区

表、B 树索引的物理存储格式都是 B 树。

一个 B 树包含两个段,一个内节点段,存放内节点数据;一个叶子段,存放叶子节点数据。其B树的逻辑关系由段内页面上的记录,通过文件指针来完成。

当表上没有指定聚簇索引时,系统会自动产生一个唯一标识 rowid 作为 B 树的 key 来唯一标识一行。

3.3.2 堆表数据 

堆表的数据是以挂链形式存储的,一般情况下,支持最多 128 个链表,一个链表在物理上就是一个段,堆表采用的是物理 rowid,在插入过程中,rowid 在事先已确定,并保证其唯一性,所以可以并发插入,插入效率很高,且由于 rowid 是即时生成,无需保存在物理磁盘上,也节省了空间。

3.3.3 列存储数据 

数据按列方式组织存储,每个列包含 2 个段,一个段存放列数据,一个段存放列的控制信息,读取列数据时,只需要顺序扫描这两个段。在某些特殊应用场景下,其效率要远远高于行存储。

3.3.4 位图索引 

位图索引与 B 树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。

数据文件中还有两类特殊的数据文件:ROLL 和 TEMP 文件。

3.3.5 ROLL 文件

ROLL 表空间的 dbf 文件,称为 ROLL 文件。ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息。回滚文件整个是一个段。每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。

3.3.6 TEMP 文件

TEMP.DBF 临时数据文件,临时文件可以在 dm.ini 中通过 TEMP_SIZE 配置大小。当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在 TEMP.DBF 文件中,供后续运算使用。系统中用户创建的临时表也存储在临时文件中。

3.4重做日志文件

重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。主要用于数据库的备份与恢复。

重做日志(即REDO日志)指在DM数据库中添加、删除、修改对象,或者改变数据,DM都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件以log为扩展名。每个DM数据库实例必须至少有2个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用。

非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储。

归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。

3.5归档日志文件

归档日志文件,就是在归档模式下,重做日志被连续写入到归档日志后,所生成了归档日志文件。归档日志文件以归档时间命名,扩展名也是log。但只有在归档模式下运行时,DM数据库才会将重做日志写入到归档日志文件中。

3.6备份文件

备份文件以bak为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一。

备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。同时,系统还会自动记录备份信息及该备份文件所处的位置.

3.7跟踪日志文件

用户在dm.ini中配置SVR_LOG和SVR_LOG_SWITCH_COUNT参数后就会打开跟踪日志。跟踪日志文件是一个纯文本文件,以“dm_commit_日期_时间”命名,默认生成在DM安装目录的log子目录下面,管理员可通过ini参数SVR_LOG_FILE_PATH设置其生成路径。

打开跟踪日志会对系统的性能会有较大影响

3.8事件日志文件

DM数据库系统在运行过程中,会在log子目录下产生一个“dm_实例名_日期”命名的事件日志文件。事件日志文件对DM数据库运行时的关键事件进行记录,如系统启动、关闭、内存申请失败、IO错误等一些致命错误。

.DM内存结构

数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是DBMS系统所必须的。通常内存管理系统会带来以下好处:

申请、释放内存效率更高;

能够有效地了解内存的使用情况;

易于发现内存泄露和内存写越界的问题。

DM数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。

4.1内存池

DM的内存池包含有共享内存池和运行时内存池。 动态视图 V$MEM_POOL 详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握 DM Server 的内存使用情况

共享内存池是 DM Server 在启动时从操作系统申请的一大片内存。在 DM Server 的运行期间,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。采用共享内存池则可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中 需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。 DM 系统管理员可以通过 DM Server 的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为 MEMORY_POOL,该配置默认为200M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展, INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,参数 MEMORY_TARGET 则指定了共享内存池能扩展到的最大大小

MEMORY_POOL 决定了M为单位的公共内存池的大小,MEMORY_POOL 是静态参数,所以不能直接修改内存中的数值。只能修改 dm.ini 中的数值,然后重启生效。

常用查询共享内存的视图:

V$mem_pool数据字典

 

SQL> select distinct name from V$MEM_POOL order by name;

通过参数查看内存:0 表示无限制

SQL> select para_name,para_value from v$dm_ini where para_name='MEMORY_TARGET';

SQL> select para_name,para_value from v$dm_ini where para_name='MEMORY_POOL';

4.2缓冲区

   数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方;日志缓冲区是用于存放重做日志的内存缓冲区;字典缓冲区主要存储一些数据字典,如模式信息、表信息、列信息、触发器信息等。SQL缓冲区提供执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。

4.2.1 数据缓冲区

   数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方;对比Oracle的database buffer cache。日志缓冲区是用于存放重做日志的内存缓冲区;字典缓冲区主要存储一些数据字典,如模式信息、表信息、列信息、触发器信息等。SQL缓冲区提供执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。这是DM Server至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘IO频繁;将其设定得太大,又会导致操作系统内存本身不够用。

达梦数据库中有四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。

达梦数据库中有四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。

SQL> select distinct name from v$bufferpool;

LINEID NAME

---------- -------

KEEP

RECYCLE

FAST

NORMAL

ROLL

系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。

LRU链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从LRU链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少IO。

在系统运行过程中,通常存在一部分“非常热”(反复被访问)的数据页,将它们一直留在缓冲区中,对系统性能会有好处。对于这部分数据页,数据缓冲区开辟了一个特定的区域用于存放它们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中。

四种类型的数据缓冲区

DM Server中有四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE

其中,用户可以在创建表空间或修改表空间时,指定表空间属于NORMAL或KEEP缓冲区。RECYCLE缓冲区供临时表空间使用,FAST缓冲区根据用户指定的FAST_POOL_PAGES大小由系统自动进行管理,用户不能指定使用RECYCLE和FAST缓冲区的表或表空间。

NORMAL缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为NORMAL;

KEEP的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为KEEP。

DMServer提供了可以更改这些缓冲区大小的参数,用户可以根据自己应用需求情况,指定dm.ini文件中BUFFER(100MB)、KEEP(8MB)、RECYCLE(64MB)、FAST_POOL_PAGES(3000)值(括号中为默认值),这些值分别对应是NORMAL缓冲区大小、KEEP缓冲区大小、RECYCLE缓冲区大小、FAST缓冲区数据页总数。

查看数据缓冲区相关参数:

如果需要修改,可以直接更改DM.INI中的数值(不推荐),或者使用达梦控制台工具进行修改(推荐)。

以上所列BUFFER相关参数均为静态参数,修改后需要重启服务器才能生效。

当BUFFER_POOLS=1时,系统支持缓冲区的自动扩展。MAX_BUFFER表示最多能扩到多大。在自动扩展后,如果系统的压力在一段时间内比较低,系统又会自动收缩缓冲区。

如何查看数据缓冲区使用情况动态性能视图V$BUFFERPOOL来监控数据缓冲区的使用情况。该视图结构如下:

4) 读多页在需要进行大量I/O的应用当中,DM之前版本的策略是每次只读取一页。如果知道用户需要读取表的大量数据,当读取到第一页时,可以猜测用户可能需要读取这页的下一页,在这种情况下,一次性读取多页就可以减少I/O次数,从而提高了数据的查询、修改效率。

DM Server提供了可以读取多页的参数,用户可以指定这些参数来调整数据库运行效率的最佳状态。在DM配置文件dm.ini中,可以指定参数MULTI_PAGE_GET_NUM大小(默认值为16页),来控制每次读取的页数。如果用户没有设置较适合的参数MULTI_PAGE_GET_NUM值大小,有时可能会给用户带来更差的效果。如果MULTI_PAGE_GET_NUM太大,每次读取的页可能大多都不是以后所用到的数据页,这样不仅会增加I/O的读取,而且每次都会做一些无用的I/O,所以系统管理员需要衡量好自己应用需求,给出最佳方案。

查出当前数据库的缓冲区使用情况。

SQL>select name,page_size*n_pages/1024/1024

total_size,page_size*free/1024/1024 free_size from v$bufferpool;

4.2.2日志缓冲区

日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘IO而使系统性能受到影响,系统 在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。那么 为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?

主要是基于以下原因:

1. 重做日志的格式同数据页完全不一样,无法进行统一管理;

2. 重做日志具备连续写的特点;

3. 在逻辑上,写重做日志比数据页IO优先级更高。

DM Server 提供了参数 RLOG_BUF_SIZE 对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内 存池中申请的,单位为页数量,且大小必须为 2 的 N 次方,否则采用系统默认大小 512

SQL> select para_name,para_value from v$dm_ini where para_name like 'RLOG_BUF_SIZE';

4.2.3字典缓冲区

 缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要I/O才能读取到这些信息。

DM8采用的是将部分数据字典信息加载到缓冲区中,并采用LRU算法进行字典信息的控制。缓冲区大小设置问题,如果太大,会浪费宝贵的内存空间,如果太小,可能会频繁的进行淘汰,该缓冲区配置参数为

DICT_BUF_SIZE,默认的配置大小为5M

DM8采用缓冲部分字典对象,那会影响效率吗?数据字典信息访问存在热点现像,并不是所有的字典信息都会被频繁的访问,所以按需加载字典信息并不会影响到实际的运行效率。

但是如果在实际应用中涉及对分区数较多的水平分区表访问,例如上千个分区,那么就需要适当调大DICT_BUF_SIZE参数值。存放最近使用的数据字典,目的还是减少磁盘IO

SQL> select para_name,para_value from v$dm_ini where para_name like 'DICT_BUF_SIZE';

参数调优:
对应参数:DICT_BUF_SIZE;生产环境建议设置:32M;当系统中对象个数较多时适当调大。

4.2.4 SQL缓冲区

SQL缓冲区提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。

很多应用当中都存在反复执行相同SQL语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。这样带来的好处是加快了SQL语句执行效率,但同时给内存也增加了压力。

DMServer在配置文件dm.ini提供了参数来支持是否需要计划重用,参数为USE_PLN_POOL,当指定为非0时,则启动计划重用;为0时禁止计划重用。DM同时还提供了参数CACHE_POOL_SIZE(单位为MB),来改变SQL 缓冲区大小,系统管理员可以设置该值以满足应用需求,默认值为20M。

结果集缓存包括SQL查询结果集缓存和DMSQL程序函数结果集缓存,在INI参数文件中同时设置参数RS_CAN_CACHE=1且USE_PLN_POOL非0时DM服务器才会缓存结果集。

SQL>select para_name,para_value from v$dm_ini where para_name='USE_PLN_POOL';

这是启用SQL缓存区的结果:

参数调优:
对应的参数:CACHE_POOL_SIZE;生产建议设置一般配置为1000M~4000M。

4.3排序区

排序缓冲区提供数据排序所需要的内存空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。

如果内存排序无法完成,把部分排序转到磁盘上即temp表空间中。

DM Server提供了参数来指定排序缓冲区的大小,参数SORT_BUF_SIZE在DM配置文件dm.ini中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值2M。

SQL> select para_name,para_value  from v$dm_ini where para_name like 'SORT_BUF_SIZE';

参数调优:
对应的参数:SORT_BUF_SIZE;生产建议设置:32M;当创建索引时调大点。

4.4哈希区

DM8提供了为哈希连接(hash join)而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用DM8创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上使用的还是VPOOL内存池来进行哈希操作。

DM Server在dm.ini中提供了参数HJ_BUF_SIZE来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。

SQL> select para_name,para_value from v$dm_ini where para_name like 'HJ_BUF_SIZE';

除了提供HJ_BUF_SIZE参数外,DMServer还提供了创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE 表示处理聚集函数时创建哈希表的个数,建议保持默认值100000。

SQL>select para_name,para_value from v$dm_ini where para_name like 'HAGR_HASH_SIZE';

参数调优:
对应参数:HJ_BUF_GLOBAL_SIZE: 哈希连接使用的内存空间上限;生产环境建议设置:5000M

当高并发、hash操作多适当调大
对应参数:HJ_BUF_SIZE:单个哈希连接使用的内存;生产环境建议设置:500M;有大表的hash连接应调大

4.5 SSD缓存区

固态硬盘采用闪存作为存储介质,因没有机械磁头的寻道时间,在读写效率上比机械磁 盘具有优势。在内存、SSD 磁盘、机械磁盘之间,符合存储分级的条件。为提高系统执行效率,DM Server 将 SSD 文件作为内存缓存与普通磁盘之间的缓冲层,称为“SSD 缓存”。
参数调优:
默认 SSD 缓冲区是关闭的,即 SSD_BUF_SIZE 为 0。若要配置 SSD 缓冲区,将其设置
为大于 0 的数并指定 SSD_FILE_PATH 即可。

SQL> select para_name,para_value from v$dm_ini where para_name like 'SSD_BUF_SIZE';

  • DM线程结构

DM服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。

服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,

服务器进程称为共享服务器进程。

查看进程信息:

SQL> select * from v$process;

[dmdba@dmdbsrv ~]$ ps -ef|grep dmserver

 

看进程所对应的线程信息:

SQL> select * from v$threads;

[dmdba@dmdbsrv ~]$ ps -Lf 1107

[dmdba@dmdbsrv ~]$ pstree -p 1274

5.1 监听线程

  监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。 它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。

5.2 工作线程

   工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行 相应的处理,负责所有实际的数据相关操作。DM8的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。

5.3 IO线程

 在数据库活动中,IO操作历来都是最为耗时的操作之一。DM Server需要进行IO操作的时机主要有以下三种:

1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;

2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;

3. 检查点到来时,需要将所有脏数据页写入磁盘。

IO线程在启动后,通常都处于睡眠状态,当系统需要进行IO时,只需要发出一个IO请求,此时IO线程被唤醒以处理该请求,在完成该IO操作后继续进入睡眠状态。

5.4调度线程

调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的 任务有以下一些:

1. 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列 由工作线程执行;

2. 清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;

3. 检查数据重演捕获持续时间是否到期,到期则自动停止捕获;

4. 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;

5. 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;

6. 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;

7. 必要时执行数据更新页刷盘;

8. 唤醒等待的工作线程。

5.5 日志FLUSH线程

  任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓 冲区中,当事务提交或者执行检查点时,会通知FLUSH线程进行日志刷盘。由于日志具备 顺序写入的特点,比数据页分散IO写入效率更高。日志FLUSH线程和IO线程分开,能获得更快的响应速度,保证整体的性能。DM8的日志FLUSH线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了IO次数,进一步提高了性能。

如果系统配置了实时归档,在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。

5.6日志归档线程

日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。 将日志FLUSH线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离FLUSH线程来做,如果放在FLUSH线程中一起做会严重影响系统性能。

5.7日志APPLY线程

 在配置了数据守护的系统中,创建了一个日志APPLY线程。当服务器作为备库时,每次接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。

达梦云适配技术社区
https://eco.dameng.com/

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值