文章目录
- 内存结构
- SQL缓冲区:
- 字典缓冲区:DICT_BUF_SIZE
- 主内存池
- 运行时内存池
内存结构
SQL缓冲区:
- 说明
- 用来存储SQL语句,执行计划,结果集,默认结果集是关闭的
- 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缓冲区的作用
- 能使用静态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
- 避免了频繁向磁盘请求获取系统表信息
- 减少系统表信息解析开销
- 默认值是50,读取系统表的字典信息存放在这里
select * from V$DICT_CACHE_ITEM;
select * from V$DICT_CACHE;
主内存池
- MEMORY_POOL:开机申请一大块内存,需要时从该池分配,默认值200
- MEMORY_EXTENT_SIZE:如果所要内存超过MEMORY_POOL大小,该参数设置每次扩展大小,默认值32
- MEMORY_TARGET:指定了共享内存池能扩展到的最大大小,默认值0,无限制
- MEMORY_N_POOLS:主内存池的个数,如果是高并发可以设置多个,默认是1
select * from v$parameter where name like '%MEMORY%';
运行时内存池
- HASH哈希区、排序区、会话池等。运行时内存池的特点是需要时申请,用完即释放。
- 另一种使用内存的方式,从操作系统申请一大片内存来做成自己模块的内存池来使用
- VM_POOL:默认值64
- SESS_POOL:默认值16384
- RT_HEAP:默认值16384
- 排序区
- 少量的数据排序(内存中可以排下)优先在内存中排序,如果内存排不下,会占用临时表空间进行排序
- 如果业务中sql排序比较多,可以增大排序区。SORT_BUF_SIZE
- SORT_BUF_GLOBAL_SIZE:全局排序区内存大小,默认是500
- SORT_BUF_SIZE:单会话排序区内存大小,默认值是10
- 哈希区
- 用于HASH连接,HJ_BUF_SIZE 单个hash连接占用连接占用的内存大小
- HJ_BUF_GLOBAL_SIZE:全局哈希区内存大小
- HJ_BUF_SIZE:单会话哈希区内存大小