DM 数据库为数据库中的所有对象分配逻辑空间,并 存放在数据文 件中。在 DM 数据库内部,所有的数据文件组合在一起被划分到一个 或者多个表空间中,所有的数据 库内部对象都存放在这些表空间中。同时表空间被进一步划分为段、簇和页(也称块)。通过这种细分,可以使得 DM 数据库能够更加高效地控制磁盘空间的利用率。
可以看出,在DM8 中存储的层次结构如下:
(1)数据库由一个或多个表空间组成;
(2)每个表空间由一个或多个数据文件组成;
(3)每个数据文件由一个或多个簇组成;
(4) 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
(5)簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
(6)页是数据库中最小的分配单元,也是数据库中使用的最小的IO 单元。
表空间
在达梦数据库中,表空间由一个或者多个数据文件组成。达梦数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。
在创建达梦数据库时,会自动创建5 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN
表空间、TEMP 表空间和HMAIN 表空间。
(1)SYSTEM 表空间存放了有关达梦数据库的字典信息,用户不能在SYSTEM 表空间创
建表和索引。
(2)ROLL 表空间完全由达梦数据库自动维护,用户无需干预。该表空间用来存放事务运
行过程中执行DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致
性视图。
(3)MAIN 表空间在初始化库的时候,就会自动创建一个大小为128M 的数据文件
MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定MAIN 表
空间为用户默认的表空间。
(4)TEMP 表空间完全由达梦数据库自动维护。当用户的SQL 语句需要磁盘空间来完成
某个操作时,达梦数据库会从TEMP 表空间分配临时段。如创建索引、无法在内存中
完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到TEMP
表空间。
(5)HMAIN 表空间属于HTS 表空间,完全由达梦数据库自动维护,用户无需干涉。当用
户在创建HUGE 表时,未指定HTS 表空间的情况下,充当默认HTS 表空间。
2)记录
数据库表中的每一行是一条记录。在达梦数据库中,除了 Huge 表,其他的表都是在数据页中按记录存储数据的。也就是说,记录是存储在数据页中的,记录并不是达梦数据库的存储单位,页才是。 由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制 。数据页中还包含了页头控制信息等空间,因此达梦规定每条记录的总长度不能超过页面大小的一半。
3)页
数据页(也称数据块) 是达梦数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在达梦数据库中,页大小可以为4KB、8KB、16KB或者32 K B
用户在创建数据库时可以指定,默认大小为8K B ,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。
4)簇
簇是数据页的上级逻辑单元,由同一个数据文件中16个或32个或64个 连续的数据页组成。在达梦数据库中,簇的大小由用户在创建数据库时指定,默认大小16 。假定某个数
据文件大小为32MB页大小为8KB,则共有 32MB/8KB /16 =256 个簇,每个簇的大小为
8K*16=1 28K 。和数据页的大小一样 ,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。
5)段
段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不
同数据文件的簇,即一个段可以跨越不同的数据文件 。而一个簇以及该簇所包含的数据页则只能来自一个数据文件,是连续的16或者32个数据页。由于簇的数量是按需分配的 ,数据段中的不同簇在磁盘上不一定连续。
每个 DM 数据库都有一个名为 dm.ctl 的控制文件。
控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容
····数据库名称;
····数据库服务器模式;
····OGUID 唯一标识;
····数据库服务器版本;
····数据文件版本;
····数据库的启动次数;
····数据库最后一次启动时间;
····表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;
····控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。
在数据库服务器运行期间,执行表空间的 DDL 等操作后,数据库服务器内部需要同步修改控制文件内容。
如果在修改过程中服务器故障,可能会导致控制文件损坏,为了避免出现这种情况,在修改控制文件时系统内部会执行备份操作。
控制文件的备份策略如下
策略一 在修改 dm.ctl 之前,先执行一次备份,确定 dm.ctl 修改成功后,再将备份删除,如果 dm.ctl 修改失败或中途故障,则保留备份文件。
策略二 在修改 dm.ctl 成功之后,根据 dm.ini 中指定的 CTL_BAK_PATH/CTL_BAK_NUM 对最新的 dm.ctl 执行备份。
如果用户指定的 CTL_BAK_PATH 是非法路径,则不再生成备份文件,在路径有效的情况下,生成备份文件时根据指定的 CTL_BAK_NUM 判断是否删除老的备份文件。
注意
····如果 dm.ctl 文件存放在裸设备上,则策略一不会生效。
····如果指定的 CTL_BAK_PATH 是无效路径,则策略二也不会生效。
····如果策略一和策略二的条件都满足,则都会生效执行,否则只执行满足条件的备份策略,如果都不满足,则不会再生成备份文件。
····如果是初始化新库,在初始化完成后,会在“SYSTEM_PATH/CTL_BAK”路径下对原始的 dm.ctl 执行一次备份。
数据文件以 dbf 为扩展名。
数据文件是数据库中最重要的文件类型,一个 DM 数据文件对应磁盘上的一个物理文件或达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方,每个达梦数据库至少有一个与之相关的数据文件。
当 DM 数据库的数据文件空间用完时,它可以自动扩展。
可以在创建数据文件是通过 MAXSIZE 参数限制数据文件的扩展量。
数据文件的大小也会受物理磁盘大小的限制。
实际应用中,一般不建议使用单个巨大的数据文件,为一个表空间创建多个较小的数据文件是更好的选择。
数据文件按数据组织形式,可以分为如下几种
1)B 树数据
行存储数据,也是应用最广泛的存储形式。
其数据是按 B 数索引组织的。
普通表、分区表、B 树索引的物理存储格式都是 B 树。
一个 B 树包含两个段,一个内节点段,存放内节点数据;一个叶子段,存放叶子节点数据。
其 B 树的逻辑关系由段内页面上的记录,通过文件指针来完成。
当表上没有指定聚簇索引时,系统会自动产生一个唯一标识 rowid 作为 B 树的 key 来唯一标识一行。
2)堆表数据
堆表的数据是以挂链形式存储的,一般情况下,支持最多 128 个链表。
一个链表在物理上就是一个段,堆表采用的是物理 rowid,在插入过程中,rowid 在事先已确定,并保证其唯一性,所以可以并发插入,插入效率很高。
由于物理 rowid 是即时生成,无需保存在物理磁盘上,也节省了空间。
3)列存储数据
数据按列方式组织存储,每个列包含2个段,一个段存储列数据,一个段存放列的控制信息,读取列数据时,只需要顺序扫描这两个段。
在某些特殊应用场景下,其效率要远远高于行存储。
4)位图索引
位图索引与 B 树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。
每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。
数据文件中还有两类特殊的数据文件:ROLL 和 TEMP 文件。
1)ROLL文件
ROLL 表空间的 dbf 文件,称为 ROLL 文件。
ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息。
回滚文件整个是一个段。
每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。
2)TEMP文件
TEMP.DBF 临时数据文件,临时数据文件可以在 dm.ini 中通过 TEMP_SIZE 配置大小。
当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在 TEMP.DBF 文件中,供后续运输使用。
重做日志(REDO日志)指在 DM 数据库中添加、删除、修改对象,或改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。
重做日志文件以 log 为扩展名。
每个 DM 数据库实例必须至少有2个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用。
重做日志文件也称为联机日志文件。
重做日志文件主要用于数据库的备份与恢复。
重做日志文件用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能进行故障恢复。
日志文件分为联机日志文件和归档日志文件。
在归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。
归档日志文件以归档时间命名,扩展名也是 log。
采用归档模式会对系统性能产生影响,但系统在归档模式下运行会更安全。
配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 ini 为扩展名,它们具有固定的格式。
用户可以通过修改配置文件中的某些参数值来达到如下两个方面的目标
····启用/禁用特定功能项
····针对当前系统运行环境设置更优的参数值以提升系统性能
dm.ini
每创建一个 DM 数据库,就会自动生成 dm.ini 文件。
dm.ini 文件是 DM 数据库启动所必须的配置文件,通过配置该文件可以设置 DM 数据库服务器的各种功能和性能选项。
dmmal.ini
dmmal.ini 是 MAL 系统的配置文件。
需要用到 MAL 环境的实例,所有站点的 dmmal.ini 需要保证验证一致。
dmarch.ini
dmarch.ini 用于本地归档和远程归档的配置。
DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
DM Server 的内存池包括共享内存池和其他一些运行时内存池。
动态视图 V$MEM_POOL 详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握 DM Server 的内存使用情况。
查询该视图中的信息:
SQL> select addr, name, file_name, file_line from v$mem_pool;
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- --------------- ----------------------------------------------- -----------
1 139824139751528 SHARE POOL 000 /home/dmops/build/svns/1646367691262/knl/mem2.c 2740
2 139824135553128 BACKUP POOL /home/dmops/build/svns/1646367691262/knl/mem2.c 2827
3 139824129085560 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
4 139824128032888 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
5 139824126980216 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
6 139824125927544 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
7 139824124874872 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
8 139824123822200 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
9 139824122769528 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
10 139824121716856 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
11 139824120664184 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- ---------------------- ------------------------------------------------- -----------
12 139824119611512 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
13 139824118558840 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
14 139824117506168 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
15 139824116453496 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
16 139824115400824 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
17 139824114348152 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
18 139824113295480 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/pq/pthd.c 423
19 139824103854200 MON ITEM ARR /home/dmops/build/svns/1646367691262/mon/dthrd.c 332
20 139824102801528 LARGE_MEM_SQL_MONITOR /home/dmops/build/svns/1646367691262/mon/dsql.c 5660
21 139824092311672 DSQL BIND DATA HISTORY /home/dmops/build/svns/1646367691262/mon/dsql.c 9221
22 132793976 CYT_CACHE /home/dmops/build/svns/1646367691262/crypto/cyt.c 442
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- ---------- ------------------------------------------------ -----------
23 132861496 XMAL SYS /home/dmops/build/svns/1646367691262/xmal/xmal.c 60
24 132929016 XBOX SYS /home/dmops/build/svns/1646367691262/xmal/xbox.c 316
25 139822256210040 DICT CACHE /home/dmops/build/svns/1646367691262/dict/ndct.c 249
26 133820952 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
27 133839320 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
28 133857688 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
29 133876056 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
30 133894424 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
31 133912792 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
32 133931160 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
33 133949528 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- ----------- ------------------------------------------------ -----------
34 133967896 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
35 133986264 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
36 134004632 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
37 134023000 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
38 134041368 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
39 134059736 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
40 134078104 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
41 134096472 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
42 134114840 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
43 134133208 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
44 134151576 INJECT HINT /home/dmops/build/svns/1646367691262/dict/ndct.c 8511
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- --------------------- ---------------------------------------------------- -----------
45 134227016 CHECK POINT /home/dmops/build/svns/1646367691262/log/ckpt2.c 220
46 134373656 HUGE AUX /home/dmops/build/svns/1646367691262/hfs/haux.c 78
47 139821799370872 SQL CACHE MANAGERMENT /home/dmops/build/svns/1646367691262/mgr/scp.c 325
48 134452744 MEM FOR PIPE /home/dmops/build/svns/1646367691262/pub/ifun_pipe.c 248
49 134521416 FLASHBACK SYS /home/dmops/build/svns/1646367691262/trx/fback.c 64
50 139821773656184 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/job/job.c 276
51 134654344 DBLINK POOL /home/dmops/build/svns/1646367691262/dblnk/dblnk.c 17176
52 134787400 NSEQ CACHE /home/dmops/build/svns/1646367691262/npar/nseq.c 1050
53 134855544 PARALLEL LOADER POOL /home/dmops/build/svns/1646367691262/bldr_dll/bldr.c 93
54 140691304 RT_MEMOBJ_VPOOL /home/dmops/build/svns/1646367691262/op/xsort3.c 582
55 135161000 PURG_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5309
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- -------------- ------------------------------------------------ -----------
56 136277288 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
57 136344808 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
58 136412328 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
59 136479848 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
60 136547368 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
61 136614888 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
62 136682408 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
63 136749928 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
64 136817448 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
65 136884968 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
66 136952488 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- --------------- ---------------------------------------------------- -----------
67 137020008 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
68 137087528 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
69 137155048 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
70 137222568 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
71 137290088 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
72 137357608 PURG_ITEM_POOL /home/dmops/build/svns/1646367691262/trx/purg2.c 5505
73 137425128 POLICY GRP /home/dmops/build/svns/1646367691262/dict/ndctpgrp.c 347
74 139589992 SESSION /home/dmops/build/svns/1646367691262/mgr/sess4.c 1799
75 139657512 RT_HEAP /home/dmops/build/svns/1646367691262/mgr/sess4.c 1500
76 139821991075176 TRX /home/dmops/build/svns/1646367691262/trx/trx4.c 2960
77 139821993260616 VIRTUAL MACHINE /home/dmops/build/svns/1646367691262/op/vm.c 1319
LINEID ADDR NAME FILE_NAME FILE_LINE
---------- -------------------- ----------------- ----------------------------------------------- -----------
78 139821517693048 DSQL STAT HISTORY /home/dmops/build/svns/1646367691262/mon/dsql.c 8505
78 rows got
used time: 2.223(ms). Execute id is 55201.
SQL>
通过查看动态视图V$MEM_POOL,达梦数据库返回了23条内存池的信息,V$MEM_POOL能提供的内存池信息相当丰富,我们通过desc命令可以查看这个视图所能提供的全部信息。
SQL> desc v$mem_pool
1.1 共享内存池
采用共享内存池则可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
DM 系统管理员可以通过 DM Server 的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为 MEMORY_POOL,该配置默认为 200M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展,INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,参数 MEMORY_TARGET 则指定了共享内存池能扩展到的最大大小。
查看共享池基本信息:
SQL> select name, org_size, total_size, data_size, target_size from v$mem_pool where name like 'SHARE%';
查看共享池配置参数,
SQL> select para_name, para_value from v$dm_ini where para_name like '%MEMORY_TAR%';
MEMORY_TARGET 共享内存的总大小 。0:表示不限制。
1.2 运行时内存池
除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。
这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
2.1 数据缓冲区
数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DM Server 至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁;将其设定得太大,又会导致操作系统内存本身不够用。
系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是自由链,用于存放目前尚未使用的内存数据页,一条是LRU链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。
LRU 链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从 LRU 链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少 IO。
在系统运行过程中,通常存在一部分“非常热”(反复被访问)的数据页,将它们一直留在缓冲区中,对系统性能会有好处。对于这部分数据页,数据缓冲区开辟了一个特定的区域 用于存放它们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中。
通过以下四个视图可以查看缓冲区信息:
v$bufferpool,用来记录页面缓冲区结构的信息。v$buffer_lru_first:显示所有缓冲区LRU链首页信息。v$buffer_lru_last:显示所有缓冲区LRU链末页信息。v$buffer_upd_first:显示所有缓冲区update链首页信息。v$buffer_upd_last显示所有缓冲区update链末页信息。
2.2 日志缓冲区
日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘 IO 而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。那么为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?主要是基于以下原因:
1.重做日志的格式同数据页完全不一样,无法进行统一管理;
2.重做日志具备连续写的特点;
3.在逻辑上,写重做日志比数据页 IO 优先级更高。
DM Server 提供了参数 RLOG_BUF_SIZE 对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为 2 的 N 次方,否则采用系统默认大小 512 页。
2.3 字典缓冲区
字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要 I/O 才能读取到这些信息。 DM8 采用的是将部分数据字典信息加载到缓冲区中,并采用 LRU 算法进行字典信息的控制。缓冲区大小设置问题,如果太大,会浪费宝贵的内存空间,如果太小,可能会频繁的进行淘汰,该缓冲区配置参数为 DICT_BUF_SIZE,默认的配置大小为 5M。
DM8 采用缓冲部分字典对象,那会影响效率吗?数据字典信息访问存在热点现像,并不是所有的字典信息都会被频繁的访问,所以按需加载字典信息并不会影响到实际的运行效率。
但是如果在实际应用中涉及对分区数较多的水平分区表访问,例如上千个分区,那么就需要适当调大 DICT_BUF_SIZE 参数值。
2.4 SQL 缓冲区
SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。很多应用当中都存在反复执行相同 SQL 语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。这样带来的好处是加快了 SQL 语句执行效率,但同时给内存也增加了压力。
DM Server 在配置文件 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 服务器才会缓存结果集。
DM 还提供了一些手动设置结果集缓存的方法。客户端结果集也可以缓存,但需要在配置文件 dm_svc.conf 中设置参数:
ENABLE_RS_CACHE = (1) //表示启用缓存;
RS_CACHE_SIZE = (100) //表示缓存区的大小为 100M, 可配置为 1-65535
RS_REFRESH_FREQ = (30) //表示每 30 秒检查缓存的有效性,如果失效,自动重查; 0 表示不检查。
同时在服务器端使用INI参数文件中的CLT_CACHE_TABLES参数设置哪些表的结果集需要缓存。另外,FIRST_ROWS 参数表示当查询的结果达到该行数时,就返回结果,不再继续查询,除非用户向服务器发一个 FETCH 命令。这个参数也用于客户端缓存的配置,仅当结果集的行数不超过 FIRST_ROWS 时,该结果集才可能被客户端缓存。
3 排序区
排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
DM Server 提供了参数来指定排序缓冲区的大小,参数SORT_BUF_SIZE 在 DM 配置文件 dm.ini 中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值 2M。
4 哈希区
DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上使用的还是 VPOOL 内存池来进行哈希操作。
DM Server 在 dm.ini 中提供了参数 HJ_BUF_SIZE 来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。
除了提供 HJ_BUF_SIZE 参数外,DM Server 还提供了创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE 表示处理聚集函数时创建哈希表的个数,建议保持默认值 100000。
5 SSD 缓冲区
固态硬盘采用闪存作为存储介质,因没有机械磁头的寻道时间,在读写效率上比机械磁盘具有优势。在内存、SSD 磁盘、机械磁盘之间,符合存储分级的条件。为提高系统执行效率,DM Server 将 SSD 文件作为内存缓存与普通磁盘之间的缓冲层,称为“SSD 缓存”。
DM Server 在的 dm.ini 中提供参数 SSD_BUF_SIZE 和 SSD_FILE_PATH 来配置 SSD 缓冲,SSD_BUF_SIZE 指定缓冲区的大小,单位是 M,DM Server 根据该参数创建相应大小的文件作为缓冲区使用;SSD_FILE_PATH 指定该文件所在的文件夹路径,管理员需要保证设置的路径是位于固态磁盘上。
默认 SSD 缓冲区是关闭的,即 SSD_BUF_SIZE 为 0。若要配置 SSD 缓冲区,将其设置为大于 0 的数并指定 SSD_FILE_PATH 即可。
DM数据库中的线程
DM使用单进程,多线程结构,线程分为多种类型,主要有监听线程、 IO 线程、工作线程、调度线程、日志线程等。
服务器在运行时由各种内存结构和多个线程组成,线程通过一定的同步机制对数据结构进行并发访问和处理。
线程的相关信息可以通过以下动态视图查看:
V$LATCHES 记录当前正在等待的线程信息
V$THREADS 记录当前系统中活动线程的信息
V$WTHRD_HISTORY 记录自系统启动以来,所有活动过线程的相关历史信息。
V$PROCESS 记录服务器进程信息
查看进程信息
SQL> SELECT *FROM V$PROCESS;
LINEID PID PNAME TRACE_NAME TYPE$
---------- ----------- -------- ---------- -----------
1 36925 dmserver 1
used time: 15.509(ms). Execute id is 55300.
查看线程信息
不同种类的线程数量较多
SELECT *FROM V$THREADS;
部分内容截图:
去重并按照名称分组统计
SQL> SELECT DISTINCT NAME, COUNT(*) AS NUM FROM V$THREADS GROUP BY NAME ORDER BY NUM DESC;
LINEID NAME NUM
---------- -------------- --------------------
1 dm_wrkgrp_thd 16
2 dm_io_thd 16
3 dm_tskwrk_thd 16
4 dm_hio_thd 4
5 dm_sqllog_thd 2
6 dm_redolog_thd 1
7 dm_audit_thd 1
8 dm_chkpnt_thd 1
9 dm_trctsk_thd 1
10 dm_purge_thd 1
11 dm_quit_thd 1
LINEID NAME NUM
---------- ------------ --------------------
12 dm_sql_thd 1
13 dm_sched_thd 1
14 dm_lsnr_thd 1
14 rows got
used time: 10.644(ms). Execute id is 55302.
查看线程备注信息
SELECT DISTINCT NAME, THREAD_DESC FROM V$THREADS;
LINEID NAME THREAD_DESC
---------- -------------- ------------------------------------------------------------------
1 dm_lsnr_thd Service listener thread
2 dm_sql_thd User session thread
3 dm_sqllog_thd Thread for writing dmsql dmserver
4 dm_quit_thd Thread for executing shutdown-normal operation
5 dm_io_thd IO thread
6 dm_chkpnt_thd Flush checkpoint thread
7 dm_redolog_thd Redo log thread, used to flush log
8 dm_hio_thd IO thread for HFS to read data pages
9 dm_tskwrk_thd Task Worker Thread for SQL parsing and execution for sevrer itself
10 dm_purge_thd Purge thread
11 dm_trctsk_thd Thread for writing trace information
LINEID NAME THREAD_DESC
---------- ------------- -------------------------------------------------------------------------------------
12 dm_wrkgrp_thd User working thread
13 dm_audit_thd Thread for flush audit logs
14 dm_sched_thd Server scheduling thread,used to trigger background checkpoint, time-related triggers
14 rows got
used time: 1.090(ms). Execute id is 55303.
查看等待的线程信息
SQL> SELECT *FROM V$LATCHES;
no rows
used time: 2.047(ms). Execute id is 55304.
查看自系统启动以来,所有活动过线程的相关历史信息。
SQL> SELECT *FROM V$WTHRD_HISTORY;
no rows
used time: 0.872(ms). Execute id is 55305.
监听线程
在服务器端口循环监听,当有连接请求时,监听线程被唤醒并生成会话申请任务,加入工作线程的任务队列等待处理。
此线程在系统启动完成后才启动,在系统关闭时首先关闭。监听线程比普通线程优先程度更高。
工作线程
DM服务器的核心线程。从任务队列中取出任务,并执行操作,负责所有实际的数据操作。有两个:dm_tskwrk_thd和 dm_wrkgrp_thd,当前为各16个。
此工作线程的初始个数由配置文件中的参数决定,会话增加时,工作线程也增加。一个会话上的所有任务由同一个工作线程完成,减少了线程切换代价。当
会话连接超过预设时,由会话轮询线程接收请求并加入工作线程的任务队列,等待工作线程依次执行。
在dm.ini配置文件中线程相关的参数有:
IO线程
DM将IO操作从工作线程分离出来,以此提高IO性能。
通常操作IO的时机有:
数据页不在缓冲区,需要读入。
缓冲区写满或系统关闭,此时将部分脏数据页写入磁盘。
生成检查点时,将所有脏数据页写入磁盘。
IO线程在启动后通常睡眠,当需要进行IO操作时唤醒线程。IO线程的个数可配置,通过dm.ini文件中IO_THR_GROUPS参数设置,一般默认两个,当操作系统支持异步IO时,IO线程要做的只是将IO请求递交给操作系统,操作系统完成后通知IO线程,当操作系统不支持异步IO时就需要IO线程完成实际的IO操作。
调度线程
操作系统中所有需要定时调度的任务,每秒轮询一次,主要负责以下内容:
检查系统级的时间触发器,满足触发条件则生成任务加入工作线程的任务队列中。
清理SQL缓存,计划缓存中的失效项,或超出缓存限制后淘汰不常用的缓存项。
检查数据重演捕获持续时间是否到期。
动态缓冲区检查,根据需要动态扩展或收缩系统缓冲池
执行检查点。
会话超时检测。
数据更新页刷盘。
唤醒等待的工作线程。
相关参数:
日志FLUSH线程
事务运行时,将生成的REDO日志暂存在日志缓冲区中,当事务提交或执行检查点时,通知FLUSH线程进行日志刷盘。日志顺序写入,相对于数据页分线的特点,写入效率更高,因此分开能获得更好的写入效率。
日志归档线程
包含异步归档线程,如配置非实时归档,由日志FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程做具体操作。
日志APPLY线程
在数据守护系统中,存在日志APPLY线程。备库接收主库的物理REDO日志生成APPLY任务加入队列,APPLY线程从队列中取出并在备库上将日志重做,并生成自己的日志。
定时器线程
在指定的时间或周期内进行某种操作。
主要情景有:
逻辑日志异步归档。
异步归档日志发送
作业调度
定时器线程启动后,每秒检测一次定时器链表,查看是否满足触发条件,如满足,将执行权限转交给对应的线程处理。
此线程默认不启动,可在dm.ini中配置是否启动:TIMER_INI=1
逻辑日志归档线程
用在DM8的数据赋值中,可以加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。
本地逻辑日志归档线程
从本地归档任务列表取出归档任务,生成到逻辑日志,并将逻辑日志写入逻辑日志文件。如当前逻辑日志的远程归档日志类型是同步异地归档且当前是强制刷盘,则生成异地归档任务加入到临时列表中。
远程逻辑日志归档线程
从远程归档任务列表中取出任务,并根据任务类型做响应处理,任务类型包括同步发送和异步发送。
MAL系统相关线程
用于DM内部通信的一组线程,基于TCP/IP实现。数据守护,数据复制,MPP,远程日志归档等功能依托MAL通信相关的线程实现。包括MAL监听线程,MAL发送工作线程,MAL接收工作线程等。
其他线程
还有如回滚段清理线程,审计写文件线程,重演捕获写文件线程等等。
更多产品资料,请查阅官方网站:https://eco.dameng.com