您好,欢迎访问一九零五行业门户网

oracle性能调优之

--======================================= --共享池的调整与优化(sharedpool tuning) --======================================= 共享池 ( shared pool ) 是sga中最关键的内存片段 , 共享池主要由库缓存 ( 共享sql区和pl / sql区 ) 和数据字典缓存组成。
--=======================================
-- 共享池的调整与优化(sharedpool tuning)
--=======================================
共享池(shared pool)是sga中最关键的内存片段,共享池主要由库缓存(共享sql区和pl/sql区)和数据字典缓存组成。其中库缓存的作用是存
放频繁使用的sql,pl/sql代码以及执行计划。数据字段缓存用于缓存数据字典。在内存空间有限的容量下,数据库系统根据一定的算法决定何
时释放共享池中的sql,pl/sql代码以及数据字典信息。下面逐一解释各个部件并给出调整方案。
一、共享池的组成
    library cache(库缓存)                    --存放sql ,pl/sql 代码,命令块,解析代码,执行计划
    data dictionary cache(数据字典缓存)      --存放数据对象的数据字典信息
    user global area(uga) for sharedserver session --用于共享模式,可以将该模块移到laregpool来处理。专用模式不予考虑。
二、library cache 作用与组成
    library cache 由以下四个部件组成
        shared sql areas
        private sql areas
        pl/sql proceduresand packages
        various controlstructures
    library cache 作用 
        存放用于共享的sql命令或pl/sql块
        采用lru算法(最近最少使用算法)
        用于避免相同代码的再度解析
        ora-04031则表明共享池不够用
三、data dictionary cache组成与作用
    组成
        row cache
        library cache
    作用
        存储数据库中数据文件、表、索引、列、用户和其它数据对象的定义和权限信息
四、shared pool的大小
    library cache与data dictionarycache两者共同组成了shared pool的大小,由参数shared_pool_size来决定
        查看:show parametershared_pool_size
        修改:alter system set shared_pool_size=120m;
sys@orcl> select * from v$version where rownum  2;
banner
    ----------------------------------------------------------------
    oracle database 10g enterprise edition release 10.2.0.1.0 - prod
sys@orcl> show parameter shared_pool_
name                                 type        value
    ----------------------------------------------- ------------------------------
    shared_pool_reserved_size            biginteger 3m
    shared_pool_size                     biginteger 0         --为0,表明由系统自动分配
sys@orcl> show parameter sga_
name                                 type        value
    ----------------------------------------------- ------------------------------
    sga_max_size                         biginteger 176m
    sga_target                           biginteger 176m           --非零值,表示由系统自动调整sga
五、sga_max_size与sga_target   
    sga_max_size 决定了为oracle分配内存的最大值
    sga_target   决定了基于sga_max_size的大小来自动分配内存,sga_target  sga_max_size
    sga_target会为下列组件自动分配内存
        buffer cache
        shared pool
        larege pool
        jave pool
        streams pool
    当设定sga_target参数为非零值,且又单独设定sga_target的五个组件为非零值,在这种情形下,这几个组件设定的值则为该组件所必须要
    分配的最小值。
下列sga组件不受sga_target的管理和影响,即需要单独为以下几个组件分配大小
        log buffer(日志缓冲)
        other buffer caches,such as keep, recycle, and other block sizes(保留池,回收池,nk 池)
        fixed sga and otherinternal allocations
有关sga的自动管理,更详细请参考:oracle10g sga 的自动化管理
六、librarypool 共享sql,pl/sql 代码标准
    当发布一条sql或pl/sql命令时,oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析。
    sql语句的执行过程如下:
    a.sql代码的语法(语法的正确性)及语义检查(对象的存在性与权限)
    b.将sql代码的文本进行哈希得到哈希值
    c.如果共享池中存在相同的哈希值,则对这个命令进一步判断是否进行软解析,否则到e步骤。
d.对于存在相同哈希值的新命令行,其文本将与已存在的命令行的文本逐个进行比较。这些比较包括大小写,字符串是否一致,空格,        注释等,如果一致,则对其进行软解析,转到步骤f。否则到d步骤。
    e.硬解析,生成执行计划。
    f.执行sql代码,返回结果。
有关硬解析与软解析请参考:oracle 硬解析与软解析
七、共享池中闩的竞争
    共享池中闩的竞争或library cache闩的竞争表明存在下列情形
        非共享的sql需要硬解析
        重新解析共享的sql(由于librarycache大小不足导致共享的sql被lru算法淘汰掉)
        过多的负荷导致librarycache 大小不足
八、v$librarycache视图
    scott@orcl > desc v$librarycache;
     name                          null?    type
     ----------------------------- ----------------------
     namespace                              varchar2(15)  --存储在库缓存中的对象类型,值为sqlarea,table/procedure,body,trigger
     gets                                   number   --显示请求库缓存中的条目的次数(或语句句柄数)
     gethits                                number   --显示被请求的条目存在于缓存中的次数(获得的句柄数)
     gethitratio                            number   --前两者之比
     pins                                   number   --位于execution阶段,显示库缓存中条目被执行的次数
     pinhits                                number   --位于execution阶段,显示条目已经在库缓存中之后被执行的次数
     pinhitratio                            number   --前两者之比
     reloads                                number   --显示条目因过时或无效时在库缓存中被重载的次数
     invalidations                          number   --由于对象被修改导致所有参照该对象的执行计划无效的次数,需要被再次解析
     dlm_lock_requests                      number
     dlm_pin_requests                       number
     dlm_pin_releases                       number
     dlm_invalidation_requests              number
     dlm_invalidations                      number
get表示请求条目或对象、获得对象句柄;
    pin根据句柄找到实际对象并执行,但对象内容可能因为老化而pin不到所以出现reload;
    一个session需要使用一个object时,如果是初次使用,则必然是先get然后pin并维护这个object的句柄。下次再使用这个object时,因为
    已经维护该句柄,所以直接pin而没有了get过程。如果对象老化则移除共享池,再次请求则会出现reload。
有关library cache的详细说明:v$library
由上面所列出的字段可知,v$librarycache视图可以用来监控librarycache的活动情况。
    重点关注字段
        reloads列:表示对象被重新加载的次数,理论上该值应该接近于零。过大是由于对象无效或librarypool过小被换出。
        invalidations:列表示对象失效的次数,对象失效后,需要被再次解析。
        gethitratio:该列值过低,表明过多的对象被换出内存。
        getpinratio:该列值过低,表明会话没有多次执行相同的游标,即使对象被不同的会话共享或会话没有找到共享的游标。
下面查询v$librarycache的性能状况:
        sys@asmdb > select * from v$version where rownum  2;
banner
        ----------------------------------------------------------------
        oracle9ienterprise edition release 9.2.0.1.0 - 64bit production
select namespace,gets,gethits,round(gethitratio*100,2) gethit_ratio,pins,pinhits,
          round(pinhitratio*100,2) pinhit_ratio,reloads,invalidations from v$librarycache;
namespace             gets    gethitsgethit_ratio       pins    pinhitspinhit_ratio    reloads invalidations
        --------------- ---------- ---------------------- ---------- ---------- ------------ ---------- -------------
        sqlarea         336824947  326237186        96.861137146337 1113509653        97.92    1202492      38273
        table/procedure 15363106111536263944          10015914153431591166141        99.98      85574          0
        body                144906     143990        99.37     144969     142474        98.28        128          0
        trigger           47765371   47765105          100   47765381   47765113          100          0          0
        index              1104164    1103706        99.96    1104133    1103467        99.94          0          0
        cluster              42341      42038        99.28      42860      42260         98.6          0          0
        object                   0          0          100          0          0          100          0          0
        pipe                     0          0          100          0          0          100          0          0
        javasource             40         19         47.5         40         19         47.5          0          0
        javaresource           40         19         47.5         40         19         47.5          0          0
        javadata              116         71        61.21        237        147        62.03          0          0
分析上面的查询,在此仅仅分析sql area对象,其余的类似分析
    a.在sql area中,执行的次数为次1137146337 (pins 列)。
    b.重载(reloads)的次数为1202492,表明一些对象无效或因librarycache过小被agedout,则这些对象被执行了重载。
    c.无效的对象(invalidations)为38273次。
    d.基于查询的结果,可以用于判断shared_pool_size的reloads,invalidations的情况,是否调整share_pool_size请参考后面十,十一,十二点
九、数据字典缓存(data dictionary cache)
    使用视图v$rowcache获取数据字典缓存的信息
        该视图中包含字典对象的定义信息
        gets: 请求对象的次数
        getmisses:在data dictionarycache中请求对象失败的次数
    调整目标:避免请求失败
    也可根据statspack来调整data dictionary cache
    通常情况下,应保证数据字典缓存命中率为95%或高于95%
        --下面查询数据字典缓存的命中率与缺失率
        select round(((1-sum(getmisses)/(sum(gets)+sum(getmisses))))*100,3) hit ratio
            ,round(sum(getmisses)/sum(gets)*100,3) misses ratio
        from v$rowcache
        where gets + getmisses  0;
hitratio misses ratio
        --------- ------------
           99.865         .135
缺失率应当低于以下百分比
        2%  对于常用的数据字典对象
        15% 整个数据字典缓冲对象
整个数据字典的缺失率
        select round((100*sum(getmisses)/decode(sum(gets),0,1,sum(gets))),2)  getmiss_ratio
        from v$rowcache;
getmiss_ratio
        -------------
                .14
不同的组件对象检查组件的缺失率及命中率的情况
        select parameter
                 ,sum(gets)
                 ,sum(getmisses)
                 ,round((100*sum(getmisses)/decode(sum(gets),0,1,sum(gets))),2)  getmiss_ratio
                 ,round((100*sum(gets-getmisses)/sum(gets)),2)  hit_ratio
                 ,sum(modifications) updates
        from v$rowcache
        where gets>0
        group by parameter
        order by getmiss_ratio desc,hit_ratio desc;
parameter                         sum(gets) sum(getmisses) getmiss_ratio  hit_ratio    updates
        ------------------------------------------ -------------- ------------- ---------- ----------
        dc_qmc_cache_entries                      1              1           100          0          0
        dc_constraints                           54             31         57.41      42.59         54
        dc_tablespace_quotas                    976            198         20.29      79.71        976
        dc_files                                539             32          5.94      94.06          3
        dc_global_oids                       564058           2459           .44      99.56          0
        dc_histogram_defs                 185645793         223703           .12      99.88          0
        dc_objects                         73470326          30375           .04      99.96       2228
        dc_segments                       112544251          50126           .04      99.96       2198
        dc_sequences                        7814295           1453           .02      99.98    7814291
关于dc_qmc_cache_entries为100%还不清楚,请大家指正。
十、优化library cache
    总原则尽可能使代码解析最小化
        确保用户尽可能使用共享的sql执行计划
        为librarycache分配更多的空间以避免淘汰最老的代码与执行计划
        避免无效的再度解析(如librarycache已经存在某个对象的解析,而该对象结构发生了变化)
    避免library cache中过多的碎片
        为library cache使用保留空间
        锁定一些频繁使用的对象到librarycache中,以避免lru算法淘汰掉
        排除较大的pl/sql匿名块或对其进行拆分
        对于共享服务器模式可以分配largepool给uga,避免对共享池的争用
十一、调整shared_pool_size
    1.监控对象的重载情况
        select namespace,
               gets,
               gethits,
               round(gethitratio * 100, 2) gethit_ratio,
               pins,
               pinhits,
               round(pinhitratio * 100, 2) pinhit_ratio,
               reloads,
               invalidations
        from   v$librarycache;   --考虑是否存在过多的reloads和invalidations
2.当库缓存的重载率大于零,应考虑增大shared_pool_size
select sum(pins) executions,sum(reloads) cachemisses while executing,
           round(sum(reloads)/sum(pins)*100,2) as reload ratio, % from v$librarycache;
executionscache misses while executing reload ratio, %
        ---------- -------------------------------------------
        2777717625                      1288253             .05
3.库缓存的命中率应保持在95%,否则应考虑增大shared_pool_size
        select sum(pins) executions,sum(reloads) cachemisses while executing,
          round((sum(pins)/(sum(reloads)+sum(pins)))*100,2)
          hitratio, % from v$librarycache;
executionscache misses while executing hit ratio, %
        ---------- ----------------------------------------
        2777727542                      1288257        99.95
4.估算library cache占用大小,shared pool的可用空间,总大小
--查看共享池可用空间,当sharedpool有过多的可用空间,再调大shared pool则意义不大       
            select pool,name,bytes/1024/1024 from v$sgastat where name like '%free memory%' and pool = 'sharedpool';
pool        name                       bytes/1024/1024
            ----------- -----------------------------------------
            sharedpool freememory                     97.6241302
--查询已使用的library cache大小总和
            with cte as(
                select sum(sharable_mem) sharable_mem_count   --查询非sql语句(包,视图)占用的library cache大小
                from v$db_object_cache
                union all
                select sum(sharable_mem)                      --查询sql语句占用的librarycache大小      
                from v$sqlarea
                )
            select sum(sharable_mem_count)/1024/1024          --查询已使用的library cache大小总和
            from cte;                                         --实际上还有一部分为用户游标使用占用的空间,此处略去
sum(sharable_mem_count)/1024/1024
            ---------------------------------
                             820.59599971771
--查询分配的shared_pool_size的大小     
            select sum(bytes)/1024/1024 from v$sgastat where pool like '%shar%';
sum(bytes)/1024/1024
                --------------------
                                1216
select * from v$sgainfo  where name like 'shared%';
5.查看shared pool的分配大小,已使用空间,可用空间,已用空间的百分比
        column shared_pool_used format 9,999.99
        column shared_pool_size format 9,999.99
        column shared_pool_avail format 9,999.99
        column shared_pool_pct format 999.99
select sum(a.bytes) / (1024 * 1024) shared_pool_used,
               max(b.value) / (1024 * 1024) shared_pool_size,
               (max(b.value) - sum(a.bytes)) / (1024 * 1024) shared_pool_avail,
               (sum(a.bytes) / max(b.value)) * 100 shared_pool_per
        from   v$sgastat a, v$parameterb
        where  a.name in ('table definiti',
                          'dictionary cache',
                          'library cache',
                          'sql area',
                          'pl/sql diana')
               and b.name = 'shared_pool_size';
shared_pool_usedshared_pool_size shared_pool_avail shared_pool_per
        ---------------- --------------------------------- ---------------
                  965.49         1,152.00            186.51       83.809699
6.根据上述的各个情况的判断,检查v$shared_pool_advice来判断增加shared_pool_size
         select shared_pool_size_for_estimate est_size,
                shared_pool_size_factorsize_factor,
                estd_lc_size,
                estd_lc_memory_objectsobj_cnt,
                estd_lc_time_saved_factorsav_factor
         from   v$shared_pool_advice;
est_sizesize_factor estd_lc_size    obj_cnt sav_factor
        --------- ----------- ---------------------- ----------
              640       .5556          642      54947          1
              768       .6667          769      80736          1
              896       .7778          896     101860          1
             1024       .8889         1023     135536          1
             1152           1         1150     167927          1
             1280      1.1111         1277     200423          1
             1408      1.2222         1404     234144          1
             1536      1.3333         1535     257042          1
             1664      1.4444         1662     270800          1
             1792      1.5556         1789     282202          1
             1920      1.6667         1914     294138          1
             2048      1.7778         2040     306570          1
             2176      1.8889         2169     317104          1
             2304           2         2299     327659          1
十二、共享池调优工具
    1.几个重要的性能视图
        v$sgastat
        v$librarycache
        v$sql
        v$sqlarea
        v$sqltext
        v$db_object_cache
    2.几个重要参数
        shared_pool_size
        open_cursors
        session_cached_cursors
        cursor_space_for_time
        cursor_sharing
        shared_pool_reserved_size
3.查询视图获得相关信息
        --查询执行次数小于5的sql语句
            scott@orcl> select sql_text from v$sqlarea               
              2  where executions  5 order by upper(sql_text);
--查询解析的次数
            scott@orcl> select sql_text,parse_calls,executions from v$sqlarea order by parse_calls;
对于那些相同的sql语句,但不存
其它类似信息

推荐信息