达梦数据库之内存结构

达梦数据库的内存池包括共享内存池和运行时内存池。可以通过V$MEM_POOL视图查看所有内存池的状态和使用情况。

SQL> select distinct name,is_shared from v$mem_pool order by 2;

行号 NAME IS_SHARED

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

1 CHECK POINT N

2 INJECT HINT N

3 PURG_POOL N

4 RT_HEAP N

5 RT_MEMOBJ_VPOOL N

6 SESSION N

7 VIRTUAL MACHINE N

8 BACKUP POOL Y

9 CYT_CACHE Y

10 DBLINK POOL Y

11 DICT CACHE Y

12 DMDSC LOCKSYS Y

13 DSQL BIND DATA HISTORY Y

14 DSQL ET POOL Y

15 DSQL STAT HISTORY Y

16 FLASHBACK SYS Y

17 HUGE AUX Y

18 LARGE_MEM_SQL_MONITOR Y

19 MAL SYS Y

20 MEM FOR PIPE Y

21 MON ITEM ARR Y

22 NSEQ CACHE Y

23 PARALLEL LOADER POOL Y

24 POLICY GRP Y

25 RT_MEMOBJ_VPOOL Y

26 SHARE POOL 000 Y

27 SHARE POOL 001 Y

28 SHARE POOL 002 Y

29 SHARE POOL 003 Y

30 SHARE POOL 004 Y

31 SHARE POOL 005 Y

32 SHARE POOL 006 Y

33 SHARE POOL 007 Y

34 SHARE POOL 008 Y

35 SHARE POOL 009 Y

36 SHARE POOL 010 Y

37 SHARE POOL 011 Y

38 SHARE POOL 012 Y

39 SHARE POOL 013 Y

40 SHARE POOL 014 Y

41 SHARE POOL 015 Y

42 SQL CACHE MANAGERMENT Y

43 TRX Y

44 XBOX SYS Y

45 XMAL SYS Y

45 rows got

根据查询结果,可以发现内存池分为两种类型:共享内存池和运行时内存池,实际上在该视图里还记录了不同内存池的大小及扩展情况。

1、共享内存池

在实例运行期间,需要经常申请或释放小片内存,而向操作系统申请或释放内存时需要进行系统调用,此时可能会引起线程切换,降低系统运行效率。因此实例启动时会从操作系统中申请一大片内存,即内存池。当实例在运行中需要内存时,可以在共享内存池内申请或者释放内存。

[dmdba@dsc01 dsc0_config]$ cat dm.ini | grep MEMORY

MAX_OS_MEMORY = 100 #Maximum Percent Of OS Memory

MEMORY_POOL = 500 #Memory Pool Size In Megabyte

MEMORY_N_POOLS = 197 #Number of Memory Pool

MEMORY_TARGET = 15000 #Memory Share Pool Target Size In Megabyte

MEMORY_EXTENT_SIZE = 32 #Memory Extent Size In Megabyte

MEMORY_LEAK_CHECK = 0 #Memory Pool Leak Checking Flag

MEMORY_MAGIC_CHECK = 1 #Memory Pool Magic Checking Flag

MEMORY_BAK_POOL = 4 #Memory Backup Pool Size In Megabyte

HUGE_MEMORY_PERCENTAGE = 50 #Maximum percent of HUGE buffer that can be allocated to work as common memory pool

MAX_SESSION_MEMORY = 0 #Maximum memory(In Megabytes) a single session can use

2、运行时内存池

除了共享内存池,实例的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。

缓冲区:

1、数据库缓冲区

数据缓冲区保存的是数据页,包括用户更改的数据页和查询时从磁盘读取的数据页。该区域大小对实例性能的影响较大,设定过小会导致缓冲页命中率低,磁盘I/O频繁;设定过大会导致资源的浪费。

实例在启动时,根据配置文件中参数指定的数据缓冲区大小,小操作系统申请一片连续的内存,并将其按数据页大小进行格式化,最后置入自由链中。

(1)自由链,用于存放目前尚未使用的内存数据页。

(2)LRU链,用户存放已被使用的内存数据页(包括未修改和已修改的内存数据页)

(3)脏链,用于存放已被修改过的内存数据页。

可以通过以下视图查看缓冲区的相关信息:

1)、v$bufferpool

页面缓冲区动态性能表,用来记录页面缓冲区结构的信息。

2)、v$buffer_lru_first

显示所有缓冲区“LRU”链首页信息

3)、v$buffer_lru_last

显示所有缓冲区"LRU"链末页信息

缓冲区类型

通过如下SQL语句查询v$bufferpool视图,可以看出DM实例的内存数据缓冲区由5种类型:

normal,keep,fast,recycle和roll

SQL> select distinct name,count(*) from v$bufferpool group by name order by 2 desc;

行号 NAME COUNT(*)

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

1 RECYCLE 3

2 FAST 1

3 NORMAL 1

4 ROLL 1

5 KEEP 1

已用时间: 17.982(毫秒). 执行号:2109.

在创建表空间或者修改表空间时,可以指定表空间属于NORMAL缓冲区或者KEEP缓冲区。

NORMAL缓冲区主要是存储实例正在处理的数据页,在没有特别指定缓冲区的情况下,默认缓冲区为NORMAL;KEEP缓冲区用来存储很少淘汰或者几乎不淘汰的数据页。

recycle缓冲区供临时表空间使用;ROLL缓冲区供回滚表空间使用;FAST缓冲区根据FAST_POOL_PAGES参数指定的大小由系统自动管理,用户不能指定使RECYCLE\ROLL\FAST缓冲区的表或者表空间。

HUGE_MEMORY_PERCENTAGE = 50 #Maximum percent of HUGE buffer that can be allocated to work

HUGE_BUFFER = 80 #Initial Huge Buffer Size In Megabytes HUGE_BUFFER_POOLS = 4 #number of Huge buffer pools

BUFFER_POOLS = 197 #number of buffer pools

BUFFER = 1000 #Initial System Buffer Size In Megabytes

FAST_POOL_PAGES = 30000 #number of pages for fast pool

FAST_ROLL_PAGES = 1000 #number of pages for fast roll pages

KEEP = 8 #system KEEP buffer size in Megabytes

RECYCLE = 300 #system RECYCLE buffer size in Megabytes

RECYCLE_POOLS = 19 #Number of recycle buffer pools

ROLLSEG = 1 #system ROLLSEG buffer size in Megabytes

ROLLSEG_POOLS = 19 #Number of rollseg buffer pools

1、HUGE_MEMORY_PERCENTAGE 该参数指定在HUGE缓冲区中可以用作常规内存的分配空间百分比,有效值1-100.

2、HUGE_BUFFER 指定HUGE缓冲区的大小,供HUGE表使用,有效值为8-1048576M。

3、HUGE_BUFFER_POOLS 设置缓冲区的分区数,没个缓冲区的大小为BUFFER/BUFFER_POOLS,有效值1-512.

4、BUFFER 系统缓冲区大小,有效值为8-1048576。该值推荐设置为可用物理内存的60%-80%

5、FAST_POOL_PAGES 快速缓冲区页数,有效值范围0-99999。FAST_POOL_PAGES的值最多不能超过缓冲区总页数的一半,如果超过,系统会自动调整不BUFFER总页数的一半。

6、KEEP:KEEP缓冲区大小,有效值范围是8-1048576M。

7、RECYCLE:RECYCLE缓冲区大小,有效值范围是8-1048576M。

8、RECYCLE_POOLS:RECYCLE缓冲区分区数,每个RECYCLE分区的大小为RECYCLE/RECYCLE_POOLS,有效值是1-512.

注意,以上参数都是静态参数,修改这些值需要重启实例。因此要提前规划好,以免影响业务。

多页读

MULTI_PAGE_GET_NUM 有效范围1-128 静态参数。

设置过大,每次读取的页可能大多数都不是需要的数据页,这样不仅不会增加I/O的读取次数,而且每次都会做一些无用的IO,降低效率。

在使用数据库加密或者启动SSD缓冲区(SSD_BUF_SIZE>0)的情况下,不支持多页读取,此时即使在dm.ini中做了修改也无效。

2、日志缓冲区

日志缓冲区用于存放REDO日志的内存缓冲区。为了避免直接的磁盘I/O对实例性能造成影响,实例在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。

将日志缓冲区与数据缓冲区分开主要基于以下原因:

1)、REDO日志的格式与数据页不同,无法进行统一管理。

2)、REDO日志具备连续写的特性。

3)、逻辑上,写REDO日志比写数据页的I/O优先级更高。

RLOG_BUF_SIZE = 1024 #The Number Of Log Pages In One Log Buffer

RLOG_POOL_SIZE = 256 #Redo Log Pool Size In Megabyte

可以通过RLOG_BUF_SIZE参数对单个日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池重申请的,单位为日志页数量,且大小必须为2的N次方,最小值为1,最大值为20380.

RLOG_POOL_SIZE 参数控制的是最大日志缓冲区大小,有效范围是1-1024MB。

3、字典缓冲区

字典缓冲区主要是存储一些数据字典信息,如模式信息,表信息,列信息,触发器信息等。每个事物操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到响应操作效率,如执行查询时需要获取表的信息、列的信息等,从字典缓冲区中读取这些信息的效率要高于磁盘I/O读取。

DM实例在启动时会将部分数据字典信息加载到字典缓冲区中,并采用LRU算法进行字典信息的控制。可以修改配置文件中的DICT_BUF_SIZE参数来控制字典缓冲区的大小,该参数是静态参数,默认 值是5MB。该缓冲区从内存池中申请。

可以通过以下两个视图查看字典缓冲区的情况。

1)V$DICT_CACHE_ITEM:显示字典缓存中的字典对象信息。

2)V$DICT_CACHE:显示字典缓存信息。

SQL> select * from v$dict_cache;

行号 ADDR POOL_ID TOTAL_SIZE USED_SIZE DICT_NUM

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

1 0x0x7f4165170be8 0 52428800 11161009 2169

统计该表的行数

SQL> select count(*) from v$dict_cache_item;

行号 COUNT(*)

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

1 2171

已用时间: 0.713(毫秒). 执行号:2111.

查看该表的前十行数据

SQL> select type,name from v$dict_cache_item limit 10;

行号 TYPE NAME

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

1 USER SYSDBA

2 SYS PRIVILEGE NULL

3 USER SYS

4 INDEX SYSINDEXV$DICT_CACHE_ITEM

5 SCHEMA SYS

6 TABLE V$DICT_CACHE_ITEM

7 SCHEMA SYSDBA

8 INDEX INDEX33555463

9 TABLE WRM$_SNAPSHOT

10 INDEX INDEX33555464

10 rows got

按照类型分组并统计行数

SQL> select distinct type,count(*) from v$dict_cache_item group by type;

行号 TYPE COUNT(*)

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

1 USER 2

2 SYS PRIVILEGE 1

3 INDEX 157

4 SCHEMA 3

5 TABLE 2028

6 TRIGGER 2

7 CONSTRAINT 3

8 VIEW 1

9 SYNOM 3

10 ROLE 7

11 PACKAGE 1

11 rows got

4、sql缓冲区

SQL缓冲区停SQL语句执行过程中需要的内存(在内存池中申请),包括执行计划、SQL语句和结果集缓存。当重复执行相同的SQL语句时,可以直接使用缓冲区保存这些语句和对应的执行计划,从而提升SQL语句的执行效率。

重用执行计划由USE_PLN_POOL参数控制,该参数是静态参数,参数有以下值。

1)0:禁止执行计划重用

2)1:启用执行计划重用功能。

3)2:对不包含显式参数的语句进行常量参数化优化。

4)3:即使对包含显式参数的语句,也进行常量参数化优化。

可以通过设置CACHE_POOL_SIZE参数来控制SQL缓冲区大小,该参数也是静态参数,64位平台下的有效值范围为:1~67108864MB。

结果集缓存配置由静态参数RS_CAN_CACHE控制,该参数有以下值。

1)0:禁止重用结果集。

2)1:强制模式,此时默认缓存所有结果集,但可通过RS_CACHE_TABLES参数和HINT语句进行手动设置。

3)2:手动模式,此时默认不缓存结果集,但可通过HINT语句对必要的结果集进行缓存。

结果集缓存包括SQL查询结果集缓存和DMSQL程序函数结果集缓存,仅当参数RS_CAN_CACHE=1且USE_PLN_POOL!=0时,DM实例才会缓存结果集。

可以设置CLT_CACHE_TABLES 参数来控制单独对哪些表的结果集进行缓存,当RS_CAN_CACHE=1时,只有查询涉及的所有基表全部在此参数指定范围内,该查询才会缓存结果集。但参数值为空串时,此参数失效。

可以通过V$SQLTEXT视图查看缓冲区中的SQL语句信息。在启用执行计划重用的情况下,(即USE_PLN_POOL !=0),还可以通过以下视图查询。

1)v$sql_plan:显示缓冲区中的执行计划信息。

2)v$cacheitem:显示缓冲区中缓冲项的相关信息。

3)v$cachers:显示结果缓冲区的相关信息。

4)v$cachesql:显示SQL缓冲区中SQL语句的信息。

排序区

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

SORT_BUF_SIZE = 20 #maximum sort buffer size in Megabytes

SORT_BLK_SIZE = 1 #maximum sort blk size in Megabytes

SORT_BUF_GLOBAL_SIZE = 1000 #maximum global sort buffer size in Megabytes

SORT_FLAG = 0 #choose method of sort

SORT_FLAG:动态参数,控制排序机制,设置为0表示原排序机制(默认值);1表示用新排序机制。

SORT_BUF_SIZE:动态参数,在原排序机制下排序缓冲区的最大值,有效值范围为1-2048MB。

SORT_BLK_SIZE:动态参数,在新排序机制下没个排序分片空间的大小,有效值范围:1-50MB。

SORT_BUF_GLOBAL_SIZE:动态参数,在新排序机制下排序全局内存的使用上限,有效值范围为10~42944967294MB。

哈希区

达梦数据库为哈希连接设定的缓冲区,该缓冲区是虚拟缓冲区,在系统中没有真正创建特定哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。若计算出的数据量大小超过了哈希缓冲区的大小,则使用外存哈希方式;若没有超过哈希缓冲区的大小,则还是使用内存池来进行哈希操作。

HJ_BUF_GLOBAL_SIZE = 5000 #maximum hash buffer size for all hash join in Megabytes

HJ_BUF_SIZE = 500 #maximum hash buffer size for single hash join in Megabytes

HJ_BLK_SIZE = 2 #hash buffer size allocated each time for hash join in Megabytes

1)HJ_BUF_GLOBAL_SIZE:动态参数,哈希连接操作符的数据总缓存大小(>=HJ_BUF_SIZE),有效值范围为10~500000MB。

2)HJ_BUF_SIZE:动态参数,单个哈希连接操作符的数据总缓存大小,有效值范围为2~100000MB。

3)HJ_BLK_SIZE:动态参数,哈希连接操作符每次分配缓存(BLK)大小,必须小于HJ_BUF_SIZE,有效值范围1~50M。

SSD缓冲区

固态硬盘(SSD)采用闪存作为存储介质,因没有机械盘头的寻道时间,在读写效率上比机械盘更具有优势。达梦数据库可以将SSD文件作为内存缓存与普通磁盘之间的缓冲层,称为SSD缓冲区。

默认情况下SSD缓冲区是关闭的,如果要启用该功能,需要在dm.ini中设置如下参数.

1)SSD_BUF_SIZE:静态参数,SSD缓冲区大小,取值范围为0~4294967294MB。

2)SSD_FILE_PATH:静态参数,SSD缓冲区文件所在的文件夹路径,要保证其在SSD分区上。

3)SSD_REF_BUF_SIZE:静态参数,SSD缓冲区专用BUF大小,SSD_BUF_SIZE不为0时有效,有效值范围为:20~4096MB。

4)SSD_FLUSH_INTERBAL:静态参数,SSD缓冲刷盘轮询间隔,取值范围为0~1000ms。

5)SSD_FLUSH_STEPS:静态参数,SSD缓存刷盘向前页数,有效范围为10~100000个。

启用DDS缓冲区,将SSD_BUF_SIZE设置为大于0的值,并制定SSD_FILE_PATH即可。

社区地址:https://eco.dameng.com

猜你喜欢

转载自blog.csdn.net/duanpian_dba/article/details/127000166