深入浅出Oracle学习笔记:Buffer Cache 和Share

系统 1711 0

  Buffer cache 和 share pool 是sga中最重要最复杂的部分。

 

一.Buffer Cache

    通常数据的读取、修改都是通过buffer cache 来完成的。buffer cache 中的数据 ,oracle是通过LRU 和dirty list 这样的链表来管理的。

除了这2个,还有 hash bucket 和 cache buffer chain

 hash bucket:查找方法类似老式图书馆查书

 

二.Shared Pool

     1.shared pool 是oracle sga中重要的一部分,它主要作用是 sql共享、减少代码硬解析等

        shared_pool_size设置:oracle9以后,设置成200-300M是比较合适的

 

     2.ora-04031问题

        当尝试在共享内存分配大的连续内存失败后,oracle会清空没用的对象,尝试合并内存;如果仍然没有足够大的内存空间,就提供ora-04031.

        如果shared_pool_size 设置的够大,也不存在系统bug;那么大部分引起该问题的原因:共享池中大量的sql引起过多的内存碎片导致

        1)sql没有足够的共享空间

        2)大量不必要的解析

        3)sql没有使用绑定变量

        

        另外,虽然可以通过强制刷新系统共享内存以达到共享内存碎片合并目的,但该操作是不推荐的。

        alter system flush shared_pool。

 

        实际上,share pool的调整根本是从应用入手,应用代码的编写、调整才是根本。

 

     3.Version_count 过高的现象:

              应用系统一段时间运行缓慢,一时正常。查看了$session_wait 发现 latch free 比较多。

       通过 v$latch 表查看到 shared pool 和 liberary cache 比较大。

       通过v$sqlarea 查看到 version_count>1000 的有几个。

       问题解决:1)调整timed_statistics=true 为false

                            -----该参数是系统对  比如sql解析、执行、等待等等分别消耗了多少时间进行统计

                      2)调整cursor_sharing=similar  为 force--强制匹配 或者 exact--精确匹配(缺省值)        

                            -----该参数是sql强制变量绑定

        

                另外:说明一下cursor_sharing

                       根据oracle官方建议在11g中不推荐使用cursor_sharing=SIMILAR,其实在所有版本中都不推荐,设置为该值很容易导致高版本问题.

            而且该值会出现莫名其妙的,无法解释的高版本问题.而且根据oracle相关文档,在即将发布的12c版本中,将除掉SIMILAR值.

            对于客户库的该问题,因为很多sql未绑定参数,为了减少硬解析, 建议在业务低谷时设置cursor_sharing=FORCE,并刷新shared pool.

     

深入浅出Oracle学习笔记:Buffer Cache 和Shared pool


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论