文章目录

  • 内存结构
  • SQL缓冲区:
  • 字典缓冲区:DICT_BUF_SIZE
  • 主内存池
  • 运行时内存池


内存结构

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:单会话哈希区内存大小