|||
library cache
row chche
free cache:内存块由链连接。如果需要内存空间,就去链上寻找,有合适大小的直接用,然后昂到library cache中。如果没有合适大小的,就对大的进行分割,把小的放到小块(trunk)的链上,把用到的放到library cache中。
如果,这些小块越堆积越多(很多小空间组成空间很大),就会导致在下一个大sql进入时没有合适的空间,即时这些小块组成了很大的空间。这样就会产生ORA4031错误。
ORA4031错误:原因(1)大量硬解析(2)大量硬解析产生大量小碎片后,又产生大量大SQL语句。
在free中的链将块按大小排列,这样寻找空间时加快速度。oracle中用latch(锁)对链进行保护。
library中的链是按照ASC码排列的,方便在free中过来的SQL能够快速找到自己的位置。
select count(*) from x$ksmsp;查询shared pool 中一共有多少个chunk
select name,value from v$sysstat where name like 'parse%' 查看硬解析数
NAME VALUE
---------------------------------------------------------------- ----------
parse time cpu 367
parse time elapsed 1237
parse count (total) 13559
parse count (hard) 1866
parse count (failures) 1
alter system flush shared_pool; 清空shared_pool,所有空间都会成为free空间,不会出现4031错误。但是这个命令接下来会产生大量硬解析,是一个治标不治本的方法。
如何减少硬解析:共享SQL,
解析SQL语句为ASC码(完全是翻译SQL语句字母为ASC码,空格,数值,回车,大小写都会影响共享),然后经过哈希算法,生成一个哈希值。
因此,共享SQL必须统一书写风格,或使用绑定变量(开发需要掌握,非常有用,大量减少硬解析)。
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
cursor_sharing参数(similar,exact,force)参照官方文档
select SQL_FULLTEXT from v$sql where EXECUTIONS=1 and sql_text like '%from t%'; 好处执行次数为1的SQL语句,也就是查找没有共享的SQL。
select SQL_FULLTEXT from v$sql where EXECUTIONS=1 order by sql_text; 对执行次数较少的SQL排序,以此来发现问题。
解析命中率:select sum(pinhits)/sum(pins)*100 from v$librarycache ; 查看librarycache的命中率
select sum(gets),sum(getmisses),100*sum(gets-getmisses)/sum(gets) from v$rowchche where gets>0;查看row chche的命中率.
#经典经典#解决4031错误:(1)执行 alter system flush shared_pool;
(2) 共享SQL。
alter system set cursor_sharing='force'只能解决字面值没有使用绑定变量的问题
(3)将占内存很大的SQL过程强行保存到library cache中,dbms_shared_pool.keep('对象名')
(4)保留区(reserved area)当一个对象的阈值超过一定大小时,直接不会去free空间,会放在保留区。因此,如果在这里保存sql的请求失败时,必定会报4031错误。
select REQUEST_MISSES from v$shared_pool_reserved
alter system set 参数=?
(5)增加shared pool空间
show paramater SGA_target; 动态参数,oracle动态分配各个池的空间大小。正因为动态,可能导致参数过大耗尽系统资源,导致挂起或死机、
show paramater sga_max_size;静态参数,修改需要重启,约束sga_target的随意值。
select COMPONENT,CURRENT_SIZE from v$sga_dynamic_components;查看SGA各个动态参数,如shared pool等
挂起进程在操作系统中可以定义为暂时被淘汰出内存的进程,机器的资源是有限的,在资源不足的情况下,操作系统对在内存中的程序进行合理的安排,其中有的进程被暂时调离出内存,当条件允许的时候,会被操作系统再次调回内存,重新进入等待被执行的状态即就绪态,系统在超过一定的时间没有任何动作.
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-21 17:46
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社