lucheng918的个人博客分享 http://blog.sciencenet.cn/u/lucheng918

博文

shared pool内存组成及如何减少硬解析、解决4031错误

已有 3774 次阅读 2014-3-11 16:13 |个人分类:SGA|系统分类:科研笔记| 4031, 硬解析

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等


   挂起进程在操作系统中可以定义为暂时被淘汰出内存的进程,机器的资源是有限的,在资源不足的情况下,操作系统对在内存中的程序进行合理的安排,其中有的进程被暂时调离出内存,当条件允许的时候,会被操作系统再次调回内存,重新进入等待被执行的状态即就绪态,系统在超过一定的时间没有任何动作.



https://wap.sciencenet.cn/blog-780964-775049.html

上一篇:uspc分类号 大类 小类 网址
下一篇:oracle段区块——buffer cache
收藏 IP: 168.160.22.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-21 17:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部