注册
达梦数据库内存
培训园地/ 文章详情 /

达梦数据库内存

l 2023/04/23 2147 0 0

一.内存结构简介
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    --单个会话的初始大小

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服