热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

oracle性能调优之--SharePool调整与优化

oracle性能调优之--SharePool调整与优化----共享池的调整与优化(SharedpoolTuning)--共享池(Sharedpool)是SGA中最...SyntaxHighlighter.all();
oracle性能调优之--Share Pool调整与优化
 
--=======================================
-- 共享池的调整与优化(Sharedpool Tuning)
--=======================================
 
    共享池(Shared pool)是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成。其中库缓存的作用是存
放频繁使用的sql,pl/sql代码以及执行计划。数据字段缓存用于缓存数据字典。在内存空间有限的容量下,数据库系统根据一定的算法决定何  www.2cto.com  
时释放共享池中的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来决定  www.2cto.com  
        查看: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  www.2cto.com  
        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
 
六、Librarypool 共享SQL,PL/SQL 代码标准
    当发布一条SQL或PL/SQL命令时,Oracle会自动寻找该命令是否存在于共享池中来决定对当前的语句使用硬解析或软解析。
    SQL语句的执行过程如下:
    a.SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限)
    b.将SQL代码的文本进行哈希得到哈希值
    c.如果共享池中存在相同的哈希值,则对这个命令进一步判断是否进行软解析,否则到e步骤。
d.对于存在相同哈希值的新命令行,其文本将与已存在的命令行的文本逐个进行比较。这些比较包括大小写,字符串是否一致,空格,        注释等,如果一致,则对其进行软解析,转到步骤f。否则到d步骤。
    e.硬解析,生成执行计划。
    f.执行SQL代码,返回结果。
 
七、共享池中闩的竞争
    共享池中闩的竞争或Library cache闩的竞争表明存在下列情形
        非共享的SQL需要硬解析  www.2cto.com  
        重新解析共享的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。  www.2cto.com  
    由上面所列出的字段可知,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  www.2cto.com  
 
    分析上面的查询,在此仅仅分析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  www.2cto.com  
        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  www.2cto.com  
 
        关于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)  www.2cto.com  
          "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 &#39;%free memory%&#39; AND pool = &#39;sharedpool&#39;;
 
            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 &#39;%shar%&#39;;
           
                SUM(BYTES)/1024/1024
                --------------------
                                1216  www.2cto.com  
                   
            SELECT * FROM v$sgainfo  WHERE name LIKE &#39;Shared%&#39;;
     
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 (&#39;table definiti&#39;,
                          &#39;dictionary cache&#39;,
                          &#39;library cache&#39;,
                          &#39;sql area&#39;,
                          &#39;PL/SQL DIANA&#39;)
               AND b.name = &#39;shared_pool_size&#39;;
              
        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;  www.2cto.com  
   
         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语句,但不存在于Librarypool,可以查询视图v$sql_shared_cursor  来判断v$sql_shared_cursor  www.2cto.com  
        为什么没有被共享,以及绑定变量的错误匹配等。
 
        --查询特定对象获得句柄的命中率
            select gethitratio
            from v$librarycache
            where namespace=&#39;SQL AREA&#39;;
   
        --查询当前用户正在运行哪些SQL语句
            select sql_text,users_executing,
            executions,loads
            from v$sqlarea
 
            select * from v$sqltext
            where sql_text like &#39;select * from scott.emp where %&#39;;
       
        --收集表的统计信息
            scott@ORCL> execute dbms_stats.gather_table_stats(-     --注意此处-表示转义
            > &#39;SCOTT&#39;,&#39;EMP&#39;);
 
            PL/SQL procedure successfully completed.
 
        --通过动态性能视图获得有关share pool size的建议
            SELECT Shared_Pool_size_for_estimate AS pool_size
                   ,shared_pool_size_factor AS factor
                   ,estd_lc_size
                   ,estd_lc_time_saved
            FROM v$shared_pool_advice;
 
        --通过视图v$sql_plan查看执行计划
            SELECT operation  www.2cto.com  
                   ,object_owner
                   ,object_name
                   ,COST
            FROM v$sql_plan
            ORDER BY hash_value;
 
        --SQL语句与执行计划的对照
            --v$sql中有一列为plan_hash_value 与v$sql_plan相互参照
            SELECT a.operation
                   ,object_owner
                   ,object_name
                   ,COST
                   ,b.sql_text
            FROM v$sql_plan a
                 JOIN v$sql b
                          ON a.plan_hash_value=b.plan_hash_value
            WHERE a.object_owner = &#39;SCOTT&#39;                 
            ORDER BY a.hash_value;
 
 
 
作者 l106439814

推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
author-avatar
孙一诺她爹_480
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有