oracle性能调优之

Jun 07, 2016 pm 03:01 PM
oracle 最適化 共有 パフォーマンス チューニング 調整

--======================================= --共享池的调整与优化(Sharedpool Tuning) --======================================= 共享池 ( Shared pool ) 是SGA中最关键的内存片段 , 共享池主要由库缓存 ( 共享SQL区和PL / SQL区 ) 和数据字典缓存组成。

--=======================================

-- 共享池的调整与优化(Sharedpool Tuning)

--=======================================

 

    共享池(Shared pool)是SGA中最关键的内存片段,共享池主要由库缓存(共享SQL区和PL/SQL区)和数据字典缓存组成。其中库缓存的作用是存

放频繁使用的sqlpl/sql代码以及执行计划。数据字段缓存用于缓存数据字典。在内存空间有限的容量下,数据库系统根据一定的算法决定何

时释放共享池中的sqlpl/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_SIZESGA_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语句,但不存

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Oracle RACでハードディスクを追加および交換する方法 Oracle RACでハードディスクを追加および交換する方法 Apr 11, 2025 pm 05:39 PM

Oracle RACハードディスク新規および交換操作:ハードディスクの追加:新しいディスクの追加、ASMディスクグループの作成、クラスターへの追加、データファイルの移動。ハードディスクの交換:失敗したハードディスクを識別し、ディスクグループを閉じ、ハードディスクを交換し、ディスクグループを再開し、故障したディスクを修復し、データファイルを移動します。

Oracle Garled Codeを処理する方法 Oracle Garled Codeを処理する方法 Apr 11, 2025 pm 07:00 PM

Oracle Garledの問題は、通常、不適切な文字セット設定によって引き起こされます。ソリューションには、サーバー、データベース、クライアントの文字セットのチェックが含まれます。必要に応じて、サーバー、データベース、およびクライアント文字セットを設定します。 Convert関数またはdbms_lob.convert_lob関数を使用して、文字化けデータを修正します。常に文字セットを指定し、NLSパラメーターを正しく設定します。

Oracleを再び追求する方法 Oracleを再び追求する方法 Apr 11, 2025 pm 07:33 PM

Oracleは複数の重複排除クエリメソッドを提供します。個別のキーワードは、各列の一意の値を返します。 Group by Clauseは、結果をグループ化し、各グループの非繰り返し値を返します。一意のキーワードは、一意の行のみを含むインデックスを作成するために使用され、インデックスをクエリすると自動的に重複排除が行われます。 row_number()関数は、一意の数値を割り当て、行1のみを含む結果をフィルタリングします。min()またはmax()関数は、数値列の非繰り返し値を返します。交差する演算子は、2つの結果セットの共通値を返します(複製なし)。

Oracleの表空間サイズを確認する方法 Oracleの表空間サイズを確認する方法 Apr 11, 2025 pm 08:15 PM

Oracle Tablespaceサイズを照会するには、次の手順に従ってください。クエリを実行して、TableSpace名を決定します。DBA_TABLESPACesからTableSpace_Nameを選択します。クエリを実行してテーブルスペースのサイズをクエリします:sum(bytes)をtotal_size、sum(bytes_free)asavail_space、sum(bytes) - sum(bytes_free)as sum(bytes_free)as dba_data_files from tablespace_

クラウドサーバーに接続する方法 クラウドサーバーに接続する方法 Apr 11, 2025 pm 06:51 PM

Oracleクライアントを介してクラウドサーバーに接続する手順は次のとおりです。SSHキーを作成し、公開キーをクラウドサーバーにコピーします。 Oracleクライアントを構成し、クラウドサーバーの接続情報をtnsnames.oraファイルに追加します。 Oracleクライアントに新しいデータベース接続を作成し、ユーザー名、パスワード、およびDSNを入力します。 [OK]をクリックして、接続が成功していることを確認します。

Oracleデータベースの基本知識の概要 Oracleデータベースの基本知識の概要 Apr 11, 2025 pm 06:33 PM

Oracleデータベースは、信頼性が高く、スケーラブルで機能が豊富なリレーショナルデータベース管理システム(RDBMS)です。そのアーキテクチャは、サーバー側コンポーネント(Oracle Net)、インスタンス、共有メモリ領域(SGA)、バックグラウンドプロセス、データを保存するデータベースファイルなど、クライアントサーバーモデルに従います。基本的な概念には、表、行、列、一次キー、外部キー、インデックス、カーソルが含まれます。このデータベースは、高可用性、ビッグデータサポート、豊富な機能、強力なセキュリティ、使いやすさなどの利点で知られています。

Oracle文字セットを変更する方法 Oracle文字セットを変更する方法 Apr 11, 2025 pm 06:57 PM

Oracle文字セットを変更するには、以下が必要です。データベースをバックアップします。 init.oraファイルの文字設定設定を変更します。データベースを再起動します。既存のテーブルと列を変更して、新しい文字セットを使用します。データをリロードします。データベースリンク(オプション)を変更します。

Oracleのストアドプロシージャの使用方法 Oracleのストアドプロシージャの使用方法 Apr 11, 2025 pm 07:03 PM

ストアドプロシージャは、データベースに保存できるSQLステートメントのセットであり、別のユニットと繰り返し呼ぶことができます。パラメーター(in、out、inout)を受け入れ、コードの再利用、セキュリティ、パフォーマンス、モジュール性の利点を提供できます。例:ストアドプロシージャを作成して、2つの数値の合計を計算してOUTパラメーターに保存します。

See all articles