一.内存结构简介
DM数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。
(1) 内存池(v$mem_pool 最大大小是不固定的)
DM 数据库服务器的内存池包括共享内存池和运行时内存池
共享内存池:是DM Server在启动时从操作系统申请的一大片内存。
默认大小500M,可在dm.ini修改参数MEMORY_POOL调整大小,参数MEMORY_EXTENT_SIZE指定共享内存池每次扩展的大小,参数MEMORY_TARGET 指定共享内存池能扩展到的最大值。
运行时内存池:是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等
SQL> DESC V$MEM_POOL
行号 NAME TYPE$ NULLABLE
---------- ------------- ------------ --------
1 ADDR BIGINT Y
2 NAME VARCHAR(128) Y
3 IS_SHARED CHAR(1) Y
4 CHK_MAGIC CHAR(1) Y
5 CHK_LEAK CHAR(1) Y
6 IS_OVERFLOW CHAR(1) Y
7 IS_DSA_ITEM CHAR(1) Y
8 ORG_SIZE BIGINT Y
9 TOTAL_SIZE BIGINT Y 当前总大小
10 RESERVED_SIZE BIGINT Y 当前分配出去的大小
11 DATA_SIZE BIGINT Y 当前分配出去的数据占用大小
行号 NAME TYPE$ NULLABLE
---------- ------------------ ------------ --------
12 EXTEND_SIZE BIGINT Y
13 TARGET_SIZE BIGINT Y
14 EXTEND_LEN INTEGER Y
15 N_ALLOC INTEGER Y
16 N_EXTEND_NORMAL INTEGER Y
17 N_EXTEND_EXCLUSIVE INTEGER Y
18 N_FREE INTEGER Y
19 MAX_EXTEND_SIZE BIGINT Y
20 MIN_EXTEND_SIZE BIGINT Y
21 FILE_NAME VARCHAR(256) Y
22 FILE_LINE INTEGER Y
行号 NAME TYPE$ NULLABLE
---------- ------- ------- --------
23 CREATOR INTEGER Y 创建者线程号
内存池的总大小
SQL> select sum(TOTAL_SIZE)/1024/1024 size_mb from v$mem_pool;
行号 SIZE_MB
---------- --------------------
1 3581
SQL> show parameter memory
行号 PARA_NAME PARA_VALUE
---------- ---------------------- ----------
1 MAX_OS_MEMORY 100 (占用操作系统内存的百分比,可限制百分比)
2 MEMORY_POOL 500(内存的初始值)
3 MEMORY_N_POOLS 1 (SHARE POOL个数,并发高设置多个)
4 MEMORY_TARGET 15000
5 MEMORY_EXTENT_SIZE 32
6 MEMORY_LEAK_CHECK 0
7 MEMORY_MAGIC_CHECK 1
8 MEMORY_BAK_POOL 4
9 HUGE_MEMORY_PERCENTAGE 50
10 MAX_SESSION_MEMORY 0
11 XBOX_MEMORY_TARGET 1024
由参数可以看出,内存在设置的初始值是500M,为什么我们目前的内存查出来是3581M
分组看一下是哪些内存占用多
SQL> select name, sum(TOTAL_SIZE)/1024/1024 from v$mem_pool group by name order by 2 desc;
行号 NAME SUM(TOTAL_SIZE)/1024/1024
---------- --------------------- -------------------------
1 SHARE POOL 000 2324
2 RT_MEMOBJ_VPOOL 314 (每个会话连接是会包含RT_MEMOBJ_VPOOL)
3 SQL CACHE MANAGERMENT 299 (sql 缓冲区)
4 MON ITEM ARR 234 (监控相关)
5 SESSION 105 (连接会话多会增长)
6 FLDR Memory Pool 100 (数据快速装载)
7 VIRTUAL MACHINE 80 (和连接会话相关)
8 DICT CACHE 50 (字典缓冲区)
9 FLASHBACK SYS 21 (闪回)
10 DSQL STAT HISTORY 15 (收集统计信息的)
11 DSQL ET POOL 11 (ET估算sql代价的)
行号 NAME SUM(TOTAL_SIZE)/1024/1024
---------- ---------------------- -------------------------
12 DSQL BIND DATA HISTORY 10 (绑定变量的)
13 BACKUP POOL 4 (备用池,如果备用池被用到,说明数据库内存严重不足,可能崩溃)
14 LARGE_MEM_SQL_MONITOR 3 (大内存SQL监控)
15 TRX 2
16 POLICY GRP 2
17 PURG_POOL 1 (清理回滚段)
18 PURG_ITEM_POOL 1
19 HUGE AUX 0 (列存储表)
20 CHECK POINT 0 (检查点)
21 CYT_CACHE 0
22 AUSO STAT 0
行号 NAME SUM(TOTAL_SIZE)/1024/1024
---------- -------------------- -------------------------
23 INJECT HINT 0 (hint提示 SF_INJECT_HINT
)
24 RRAF_TS_CP_SYS 0
25 PARALLEL LOADER POOL 0
26 NSEQ CACHE 0
27 DBLINK POOL 0
28 RT_HEAP 0 (执行sql需要的)
29 XBOX SYS 0
30 MEM FOR PIPE 0
31 XMAL SYS 0
如果会话比较多,SESSION和VIRTUAL MACHINE 占用比较多
select SESSID,SQL_TEXT,state,THRD_ID from v$sessions;(查看当前会话连接)
SQL> select SESSID,SQL_TEXT,state,THRD_ID from v$sessions where state='ACTIVE';
行号 SESSID SQL_TEXT STATE THRD_ID
---------- -------------------- -------------------------------------------------------------------------- ------ -----------
1 139669785125096 select SESSID,SQL_TEXT,state,THRD_ID from v$sessions where state='ACTIVE'; ACTIVE 1845668
已用时间: 1.353(毫秒). 执行号:7079515.
达梦中每个会话单独对应一个线程
SQL> select name,total_size from V$MEM_POOL t where t.CREATOR=1845668;
行号 NAME TOTAL_SIZE
---------- --------------- --------------------
1 SESSION 6356992
2 TRX 81920
3 VIRTUAL MACHINE 3211264
如果开了ET,这里也会有ET的占用
每个会话初始的大小
SQL> show parameter sess
行号 PARA_NAME PARA_VALUE
---------- ------------------------ ----------
1 SESS_POOL_SIZE 64 (原始大小 kb)
2 SESS_POOL_TARGET 16384 (目标大小 kb,超过目标大小回收)
3 SESSION_RESULT_SET_LIMIT 10000
4 MAX_SESSIONS 10000
5 MAX_SESSION_STATEMENT 10000
6 MAX_SESSION_MEMORY 0
7 SESS_CHECK_INTERVAL 3
8 SESS_FREE_IN_SUSPEND 60
9 IDLE_SESS_THRESHOLD 5
10 SESSION_READONLY 0
11 ENET_SESS_CHECK_INTERVAL 10
行号 PARA_NAME PARA_VALUE
---------- -------------------- ----------
12 DPC_GUP_SESS_TIMEOUT 180
SQL> select name,total_size,data_size,T.ORG_SIZE,t.EXTEND_SIZE from v$mem_pool t where t.CREATOR=1845668;
行号 NAME TOTAL_SIZE DATA_SIZE ORG_SIZE EXTEND_SIZE
---------- --------------- -------------------- -------------------- -------------------- --------------------
1 SESSION 6356992 2263264 65536 1048576
2 TRX 81920 23384 16384 65536
3 VIRTUAL MACHINE 3211264 73968 65536 1048576
已用时间: 1.406(毫秒). 执行号:7079520.
ORG_SIZE原始大小是64K 通过这个指令是可以看到数据库单个会话内存,在原始大小的基础上是有扩充的。
虚拟池也有原始大小
SQL> show parameter vm_pool
行号 PARA_NAME PARA_VALUE
---------- -------------- ----------
1 VM_POOL_SIZE 64 --原始大小
2 VM_POOL_TARGET 16384 --目标大小
(2) 缓冲区(v$bufferpool 大小是固定的)
数据缓冲区:DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是DM Server至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘IO频繁;将其设定得太大,又会导致操作系统内存本身不够用。
数据缓冲区:buffer(单位是 M)、keep、recycle、fast(单位是页)
SQL> select name,value from SYS."V$PARAMETER" t where name in ('BUFFER','KEEP','RECYCLE','FAST_POOL_PAGES');
行号 NAME VALUE
---------- --------------- -----
1 BUFFER 1000
2 FAST_POOL_PAGES 3000
3 KEEP 64
4 RECYCLE 300
v$bufferpool 总大小
SQL> select sum((page_size)*N_PAGES)/1024/1024 size_mb from v$bufferpool;
行号 SIZE_MB
---------- --------------------
1 1364
每个的大小
SQL> select name,sum((page_size)*N_PAGES)/1024/1024 size_mb from v$bufferpool group by name;
行号 NAME SIZE_MB
---------- ------- --------------------
1 KEEP 64
2 RECYCLE 300
3 FAST 93
4 NORMAL 906
5 ROLL 1
日志缓冲区:日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘IO而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。
字典缓冲区:主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率。DM8 采用的是将部分数据字典信息加载到缓冲区中,并采用 LRU 算法进行字典信息的控制。
SQL缓冲区:提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。
(3) 排序区
排序区提供数据排序所需要的内存空间``。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
SQL> show parameter sort
行号 PARA_NAME PARA_VALUE
---------- -------------------- ----------
1 SORT_BUF_SIZE 50 --单个会话的目标大小
2 SORT_BLK_SIZE 1 --单个会话的初始大小
3 SORT_BUF_GLOBAL_SIZE 1000 --整个数据库的大小
4 SORT_FLAG 0
5 SORT_OPT_SIZE 0
6 TSORT_OPT 1
7 BASE_SORT_CPU 36000
8 LARGE_SORT_CPU 40000
9 SMALL_SORT_CPU 200
10 NLS_SORT_TYPE 0
11 SORT_ADAPTIVE_FLAG 0
(4) 哈希区
哈希区提供哈希连接所需要的内存空间。本质上是个虚拟缓冲区。系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。
如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。
SQL> show parameter hj
行号 PARA_NAME PARA_VALUE
---------- ------------------ ----------
1 HJ_BUF_GLOBAL_SIZE 5000 --整个数据库的大小
2 HJ_BUF_SIZE 500 --单个会话的目标大小
3 HJ_BLK_SIZE 2 --单个会话的初始大小
文章
阅读量
获赞