达梦数据库内存结构

本文详细解读了SQL缓冲区在提高查询效率中的作用,介绍了字典缓冲区(DICT_BUF_SIZE)对系统表操作的优化,以及内存池(MEMORY_POOL)的配置与运行时内存池的特性。通过实例对比展示了动态SQL与静态SQL的性能差异,以及如何利用缓存技术提升数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存结构

SQL缓冲区:

  • 说明
  1. 用来存储SQL语句,执行计划,结果集,默认结果集是关闭的
  2. CACHE_POOL_SIZE :默认值200,SQL类别多,PKG比较多,复杂的系统,建议将该参数调大
select * from v$parameter where name = 'CACHE_POOL_SIZE';
--0代表结果集缓冲关闭,1代表结果集缓冲开启,默认是关闭
select * from v$parameter where name = 'RS_CAN_CACHE';
--0代表SQL缓冲装着,1代表SQL缓冲开启,默认是开启
select * from v$parameter where name = 'USE_PLN_POOL';
  • SQL缓冲区的作用
  1. 能使用静态SQL尽量使用静态SQL,如果表是动态的无法使用静态SQL,尽量使用绑定变量
--动态SQL(每运行一次就会解析一次)执行耗时11秒 521毫秒
begin
 for i in 1..50000 loop 
  execute immediate 'insert into t_test(id,name) values('||i||','''||DBMS_RANDOM.string('A',20)||''')';
 end LOOP;
 commit;
end;

--动态SQL使用绑定变量,执行耗时885毫秒
begin
 for i in 1..50000 loop 
  execute immediate 'insert into t_test(id,name) values(?,?)' using i,DBMS_RANDOM.string('A',20);
 end LOOP;
 commit;
end;

--静态SQL,执行耗时708毫秒
begin
 for i in 1..50000 loop 
  insert into t_test(id,name) values(i,DBMS_RANDOM.string('A',20));
 end LOOP;
 commit;
end;
  • 相关数据字典
--相关数据字典:
select * from SYS."V$CACHESQL";
select * from SYS."V$CACHEPLN";
select * from SYS."V$CACHEITEM";
select * from SYS."V$SQL_PLAN";
  • DM支持执行计划的清理和绑定:
select t.name, b.* from v$ifun t, SYS."V$IFUN_ARG" B
where t.name like '%SP_CLEAR_PLAN_CACHE%'
and t.id = b.id;
select count(*) from SYS."V$CACHEPLN";--清理前22827,清理后1
--不指定执行计划id,全清,高风险操作
SP_CLEAR_PLAN_CACHE();
--指定执行计划IP清理单条
SP_CLEAR_PLAN_CACHE(PLAN_ID);

字典缓冲区:DICT_BUF_SIZE

  1. 避免了频繁向磁盘请求获取系统表信息
  2. 减少系统表信息解析开销
  3. 默认值是50,读取系统表的字典信息存放在这里
select * from V$DICT_CACHE_ITEM;
select * from V$DICT_CACHE;

主内存池

  1. MEMORY_POOL:开机申请一大块内存,需要时从该池分配,默认值200
  2. MEMORY_EXTENT_SIZE:如果所要内存超过MEMORY_POOL大小,该参数设置每次扩展大小,默认值32
  3. MEMORY_TARGET:指定了共享内存池能扩展到的最大大小,默认值0,无限制
  4. MEMORY_N_POOLS:主内存池的个数,如果是高并发可以设置多个,默认是1
select * from v$parameter where name like '%MEMORY%';

运行时内存池

  1. HASH哈希区、排序区、会话池等。运行时内存池的特点是需要时申请,用完即释放。
  2. 另一种使用内存的方式,从操作系统申请一大片内存来做成自己模块的内存池来使用
  3. VM_POOL:默认值64
  4. SESS_POOL:默认值16384
  5. RT_HEAP:默认值16384
  • 排序区
  1. 少量的数据排序(内存中可以排下)优先在内存中排序,如果内存排不下,会占用临时表空间进行排序
  2. 如果业务中sql排序比较多,可以增大排序区。SORT_BUF_SIZE
  3. SORT_BUF_GLOBAL_SIZE:全局排序区内存大小,默认是500
  4. SORT_BUF_SIZE:单会话排序区内存大小,默认值是10
  • 哈希区
  1. 用于HASH连接,HJ_BUF_SIZE 单个hash连接占用连接占用的内存大小
  2. HJ_BUF_GLOBAL_SIZE:全局哈希区内存大小
  3. HJ_BUF_SIZE:单会话哈希区内存大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

很Man的DM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值