Oracle PGA内存管理 PGA Memory Management

来源:互联网 发布:java编写helloworld 编辑:程序博客网 时间:2024/04/28 09:56
一、简介
        Program Global Area(PGA)是一个和服务器进程关联的包含数据和控制信息的私有内存区域。
对于一个复杂的查询来说,需要在PAG中的SQL工作区(work area)中分配不同的内存区域来完成一些操作:
    {排序,比如order by,group by,rollup,窗口函数
    Hash join
    位图merge
    位图create

    批量加载时的write buffer}


    比如说一个排序使用排序区(sort area)完成数据在内存中的排序,一个hash join操作使用hash区(hash area)来创建一个hash表。涉及主要工作区的几个参数(SORT_AREA_SIZE,HASH_AREA_SIZE,BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE)。
    工作区的大小可以调整,一般情况下越大的工作区能明显提升某些操作的性能,但同时也使用更多的内存。
    理想情况是工作区足够大,能满足某个操作(比如排序操作),输入的排序数据和一些辅助的内存结构数据(排序需要维护一个二叉树)。这个时候我们称这个工作区是optimal size。
    如果工作区小于optimal size,响应时间会变长,因为输入数据中的部分数据经历了1次extra pass(比如排序的输入数据比较大,无法在sort area中完成,我们读取一点数据排序好,然后写到temp表空间,接着再次读取数据排序好,写到temp表空间,直到处理完所有数据,因为之前的数据都是部分排序好的,所以还需要读取每一部分排序好的数据中的一些控制信息,进行1次merge,就能返回结果了),这个时候的工作区是one-pass size。
    如果这个以上说的merge不能一次完成,需要多次merge(先读取几个部分的控制信息进行merge,再读取几个部分的控制信息进行merge,如此往复,最后把以上结果进行merge),就会大大增加响应时间和cpu的使用,那么就是multiple-pass size。

   

解释的可能不够准确,可以参考ASKTom的回答

    https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1308127400346936009
    比如排序10G的数据,需要10G多一点的内存使排序运行在optimal的状态,至少40M,才能满足one-pass,如果小于40M,就是multiple-pass。
目标就是让绝大部分的工作区是optimal size(对于纯OLTP系统来说,90%或者更高),然后少量是one-pass size,multiple-pass size是需要尽量避免的。即使是在DSS环境中,大的排序和hash-join也只需要很小的内存就能达到one-pass size,所以需要避免multiple-pass size。

    自动PGA内存管理简化和提升了PGA分配内存的方式。默认情况下PGA内存管理是开启的。在这种模式下,Oracle动态的调整PGA中不同部分的工作区大小。为了后向兼容,自动PGA内存管理可以被禁用(设置PAG_AGGREGATE_TARGET=0),这个时候可以指定通过设置参数*_AREA_SIZE来设置某个工作区的最大值,比如SORT_AREA_SIZE,还有HASH_AREA_SIZE,BITMAP_MERGE_AREA_SIZE,CREATE_BITMAP_AREA_SIZE等。


二、配置自动PGA内存管理
        自动管理PGA内存时,每个session的工作区都自动分配大小,所有*_AREA_SIZE都被忽略。任何时候,活动的工作区可用内存是PGA_AGGREGATE_TARGET参数减去被其他部分已经使用了的PGA内存。PGA内存自动管理是,数据库主要是参考PGA_AGGREGATE_TARGET的值,动态的给SQL工作区分配内存。尽可能使工作区都是optimal size,少量的one-pass size,避免multiple-pass size。
当你配置一个新的实例,刚开始很难准确的设置PGA_AGGREGATE_TARGET参数,我们可以按照以下步骤来设置:
1.初始化,估计一个值,通常是SGA的20%。这个对于DSS系统来说可能太低了。
2.运行一个有代表性的工作量负载,监控性能,使用PGA的一些统计数据,看设置的PGA_AGGREGATE_TARGET是大了还是小了。
3.调整PGA_AGGREGATE_TARGET,使用PGA advice statistics。
下面从以上3个方面展开讨论。


三、初始化设置PGA_AGGREGATE_TARGET
        设置PGA_AGGREGATE_TARGET首先是要基于数据库实例可用的物理内存,比如在有4G物理内存的主机上面,部分内存需要留给操作系统和其他非数据库应用。你可能只分配80%的内存给数据使用,其次,你还要决定这个可用内存在SGA和PGA之间的分配。
对于OLTP系统来说,一般20%分配给PGA,80%分配给SGA。
对DSS系统来说,可能要运行需要大的内存支持的查询,可以分配70%给PGA。
PGA_AGGREGATE_TARGET初始化设置可以参考以下公式:
For OLTP:PGA_AGGREGATE_TARGET=(total_mem*80%)*20%
For DSS:PGA_AGGREGATE_TARGET=(total_mem*80%)*50%


四、监控PGA内存自动管理的性能
        在调优之前,你需要监控PGA的性能,查看关键的性能数据来决定下一步如何调整。主要包括以下动态性能视图:
■ V$PGASTAT
■ V$PROCESS
■ V$PROCESS_MEMORY
■ V$SQL_WORKAREA_HISTOGRAM
■ V$SQL_WORKAREA_ACTIVE
■ V$SQL_WORKAREA

--1、 V$PGASTAT包含的是实例级别的PGA内存使用数据SQL>  select * from v$pgastat;NAME                                                    VALUE UNIT-------------------------------------------------- ---------- ------------aggregate PGA target parameter                      339738624 bytesaggregate PGA auto target                           200521728 bytesglobal memory bound                                  67947520 bytestotal PGA inuse                                     117057536 bytestotal PGA allocated                                 135889920 bytesmaximum PGA allocated                               158515200 bytestotal freeable PGA memory                             5439488 bytesprocess count                                              30max processes count                                        36PGA memory freed back to OS                          34013184 bytestotal PGA used for auto workareas                           0 bytesmaximum PGA used for auto workareas                    528384 bytestotal PGA used for manual workareas                         0 bytesmaximum PGA used for manual workareas                       0 bytesover allocation count                                       0bytes processed                                      19876864 bytesextra bytes read/written                                    0 bytescache hit percentage                                      100 percentrecompute count (total)                                    17--重点指标解释:aggregate PGA target parameter:当前PGA_AGGREGATE_TARGET的值。aggregate PGA auto target:那些运行在automatic mode下的工作区可用的pga总内存,是动态调整的。如果这个值相对于PGA_AGGREGATE_TARGET比较小,那么一些内存可能被系统的其他部分使用了,比如PL/SQL或者Java内存。global memory bound:运行在automatic mode下的单个工作区可使用的最大内存。oracle根据工作量负载动态调整,一般情况下当活跃的工作区变多,这个值会变小。通常,这个值不能小于1M,如果小于1M,就需要调整你的PGA_AGGREGATE_TARGET参数了。total PGA allocated:目前实例分配的pga内存。total freeable PGA memory:分配的pga内存可以被释放的小大。total PGA used for auto workareas:运行在automatic mode下的工作区使用的pga总内存。PGA other = total PGA allocated - total PGA used for auto workareas,通过这个等式我们可以看出其他部分使用了多少pga内存。over allocation count:上面等式中,如果PGA other + auto workarea > PGA_AGGREGATE_TARGET,也就是PGA_AGGREGATE_TARGET太小以至于不能满足PGA other加上auto workarea运行的最低内存要求,就会发生over allocationbytes processed:optimal size的工作区处理的数据量。extra bytes read/written:one-pass size,multiple-pass size工作区多处理的那部分数据量。cache hit percentage:缓存命中率,反应pga性能状况。--举个例子,有个3个1M和1个100M的数据需要排序。    4个排序操作的total bytes processed(BP)是103M,如果其中有1M是在one-pass size的工作区完成的,意味着有额外的1M数据被处理了。这个额外的1M数据是extra bytes read/written(EBP),公式如下:BP x 100 / (BP + EBP)对于上面这个例子,cache hit percentage就是99.03%,接近100%。反应了只要很小部分的排序是在one-pass size或者multiple-pass size工作区中完成的。刚刚那个例子,如果那个100M的排序是one-pass,那么EBP就是100M,那么cache hit percentage就是50.73%。--2、 V$PROCESS    每行都是一个连接到实例的进程,其中字段PGA_USED_MEM, PGA_ALLOC_MEM, PGA_FREEABLE_MEM 和 PGA_MAX_MEM 可以被用来监控这个进程使用的pga内存。SQL> SELECT PROGRAM, PGA_USED_MEM, PGA_ALLOC_MEM, PGA_FREEABLE_MEM, PGA_MAX_MEM  2  FROM V$PROCESS;PROGRAM                                            PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM-------------------------------------------------- ------------ ------------- ---------------- -----------PSEUDO                                                        0             0                0           0oracle@sean.ora11g (PMON)                                836958        918878                0      918878oracle@sean.ora11g (PSP0)                                818998        902462                0      902462oracle@sean.ora11g (VKTM)                                815758        902462                0      902462oracle@sean.ora11g (GEN0)                                823054        902494                0      902494oracle@sean.ora11g (DIAG)                                815774        902462                0      902462oracle@sean.ora11g (DBRM)                                895206       1099070                0     1099070oracle@sean.ora11g (DIA0)                               1288078       1475230            65536     1475230oracle@sean.ora11g (MMAN)                                818998        902462                0      902462oracle@sean.ora11g (DBW0)                               7156518       7537438                0     7537438oracle@sean.ora11g (LGWR)                              11448406      12174654                0    12174654oracle@sean.ora11g (CKPT)                                889182       1181550                0     1181550oracle@sean.ora11g (SMON)                               1090126       5424446          3866624     5424446oracle@sean.ora11g (RECO)                                959838       1164606                0     1164606oracle@sean.ora11g (MMON)                               2186294       3908430          1441792     3908430oracle@sean.ora11g (TNS V1-V3)                          1930414       4515310          1048576     6874606oracle@sean.ora11g (ARC0)                              17708630      18859326                0    18859326......--3、V$PROCESS_MEMORY    每个进程中的某个类别占用内存情况,相当于以上视图信息的细分,1个进程最多有6行数据,也就是6个类别。1).命名的类别,主要是4种:Java、PL\SQL、OLAP、SQL2).Freeable,可释放的内存,操作系统分配给了进程,但是没有被某个具体的类别使用。3).Other,分配给了类别的内存,但是不属于以上命名的类别可以使用CATAGORY,ALLOCATED,USED,MAX_ALLOCATED里动态监控每个进程6个类别对pga的使用情况。SQL> select pid,serial#,category,allocated,used,max_allocated from V$PROCESS_MEMORY;       PID    SERIAL# CATEGORY         ALLOCATED       USED MAX_ALLOCATED---------- ---------- --------------- ---------- ---------- -------------         2          1 PL/SQL                2008        224          2008         2          1 Other               916870                   916870         3          1 PL/SQL                2008        224          2008         3          1 Other               900454                   900454         4          1 PL/SQL                2008        224          2008         4          1 Other               900454                   900454         5          1 PL/SQL                2008        224          2008         5          1 Other               900486                   900486         6          1 PL/SQL                2008        224          2008         6          1 Other               900454                   900454         7          1 SQL                      0          0         60120         7          1 PL/SQL                2008        224          2008         7          1 Other              1097062                  1097062......--4、V$SQL_WORKAREA_HISTOGRAM    这个视图统计的是大小在某个范围的那些工作区,分别运行在optimal size、one pass size、multi pass size的情况。通过low_optimal_size和high_optimal_size定义了这个区间的边界,比如一个排序需要3m的内存才能运行在optimal size,那么它会落在2m-4m这个区间。如果一个排序使用了3m运行在one pass size,应该也是落在2m-4m这个区间。SQL> SELECT LOW_OPTIMAL_SIZE/1024 low_kb,  2  (HIGH_OPTIMAL_SIZE+1)/1024 high_kb,  3  OPTIMAL_EXECUTIONS, ONEPASS_EXECUTIONS, MULTIPASSES_EXECUTIONS  4  FROM V$SQL_WORKAREA_HISTOGRAM  5  WHERE TOTAL_EXECUTIONS != 0;    LOW_KB    HIGH_KB OPTIMAL_EXECUTIONS ONEPASS_EXECUTIONS MULTIPASSES_EXECUTIONS---------- ---------- ------------------ ------------------ ----------------------         2          4              21111                  0                      0        64        128                 52                  0                      0       128        256                 10                  0                      0       256        512                 48                  0                      0       512       1024                187                  0                      0      1024       2048                176                  0                      0      2048       4096                  8                  0                      0      4096       8192                  8                  0                      0上面的数据反映了,1m-2m这个区间176个工作区运行在optimal size,0个工作区运行在one pass size,0个运行在multi pass size。            SQL> SELECT optimal_count, round(optimal_count*100/total, 2) optimal_perc,  2  onepass_count, round(onepass_count*100/total, 2) onepass_perc,  3  multipass_count, round(multipass_count*100/total, 2) multipass_perc  4  FROM  5  (SELECT decode(sum(total_executions), 0, 1, sum(total_executions)) total,  6  sum(OPTIMAL_EXECUTIONS) optimal_count,  7  sum(ONEPASS_EXECUTIONS) onepass_count,  8  sum(MULTIPASSES_EXECUTIONS) multipass_count  9  FROM v$sql_workarea_histogram 10  WHERE low_optimal_size >= 64*1024);OPTIMAL_COUNT OPTIMAL_PERC ONEPASS_COUNT ONEPASS_PERC MULTIPASS_COUNT MULTIPASS_PERC------------- ------------ ------------- ------------ --------------- --------------          501          100             0            0               0              0这条语句是查看low_optimal_size在64kb以上的工作区,optimal、one pass、multi pass的次数和比例,因为我是刚启动的实例,所以optimal是100%--5、V$SQL_WORKAREA_ACTIVE    这里面包含的是正在运行的64k以上的工作区信息,正在使用的内存大小、最大使用的内存、pga期望的最大使用内存、是optimal还是one pass或者multi pass,使用的temp段大小。SQL> SELECT to_number(decode(SID, 65535, NULL, SID)) sid,  2  operation_type OPERATION,  3  trunc(EXPECTED_SIZE/1024) ESIZE,  4  trunc(ACTUAL_MEM_USED/1024) MEM,  5  trunc(MAX_MEM_USED/1024) "MAX MEM",  6  NUMBER_PASSES PASS,  7  trunc(TEMPSEG_SIZE/1024) TSIZE  8  FROM V$SQL_WORKAREA_ACTIVE  9  ORDER BY 1,2;  SID OPERATION ESIZE MEM MAX MEM PASS TSIZE--- ----------------- --------- --------- --------- ----- -------8 GROUP BY (SORT) 315 280 904 08 HASH-JOIN 2995 2377 2430 1 200009 GROUP BY (SORT) 34300 22688 22688 011 HASH-JOIN 18044 54482 54482 012 HASH-JOIN 18044 11406 21406 1 120000会话id为12的会话,正在运行一个hash jion,运行在one-pass模式。目前使用了11406kb,过去最大使用了21406kb,pga自动内存管理期望它最多使用18044kb。它还使用了120000kb的temp段。--6、V$SQL_WORKAREA    V$SQL_WORKAREA_ACTIVE包含的是正在运行的工作区信息,当这些工作区被释放后,他们的执行信息会被更新到V$SQL_WORKAREA视图中。可以和V$SQL关联看是哪个cursor使用的工作区,也可以和V$SQL_PLAN关联,查看是执行计划的哪个操作使用的工作区。以下查询查看需要最多内存的前10个工作区SQL> SELECT *  2  FROM (SELECT workarea_address, operation_type, policy, estimated_optimal_size  3  FROM V$SQL_WORKAREA  4  ORDER BY estimated_optimal_size DESC)  5  WHERE ROWNUM <= 10;WORKAREA_ADDRESS OPERATION_TYPE                           POLICY               ESTIMATED_OPTIMAL_SIZE---------------- ---------------------------------------- -------------------- ----------------------0000000060F56C98 HASH-JOIN                                AUTO                                24985600000000060F56C30 GROUP BY (HASH)                          AUTO                                234905600000000780C6720 GROUP BY (HASH)                          AUTO                                201728000000000783417C0 HASH-JOIN                                AUTO                                18606080000000060F56D68 HASH-JOIN                                AUTO                                17950720000000060FB97F0 HASH-JOIN                                AUTO                                173670400000000780C66B8 HASH-JOIN                                AUTO                                173670400000000773EAAB0 HASH-JOIN                                AUTO                                17367040000000060EEA8B8 GROUP BY (HASH)                          AUTO                                1685504000000007826CA20 HASH-JOIN                                AUTO                                1518592  --以下查询查看游标cursor关联的工作区运行在one pass mode或者是multi pass mode的次数SQL> SELECT sql_text, sum(ONEPASS_EXECUTIONS) onepass_cnt,  2  sum(MULTIPASSES_EXECUTIONS) mpass_cnt  3  FROM V$SQL s, V$SQL_WORKAREA wa  4  WHERE s.address = wa.address  5  GROUP BY sql_text  6  HAVING sum(ONEPASS_EXECUTIONS+MULTIPASSES_EXECUTIONS)>0;  no rows selected--通过以下查询查看某条sql的address和hash_valueSQL> SELECT address, hash_value,sql_text  2  FROM V$SQL  3  WHERE sql_text LIKE '%db_cache_advice%';  ADDRESS          HASH_VALUE SQL_TEXT---------------- ---------- --------------------------------------------------00000000632EF5F0 3231842444 select id, name, block_size, advice_status,                                       size_for_estimate, size_factor, buffers                            _for_estimate,        estd_physical_read_factor, e                            std_physical_reads,              estd_physical_rea                            d_time,                                     estd_p                            ct_of_db_time_for_reads,                                 estd_cluster_reads,                                            estd_cluster_read_time                                                       from   gv$db_cache_advi                            ce where inst_id = userenv('instance')ADDRESS          HASH_VALUE SQL_TEXT---------------- ---------- --------------------------------------------------00000000777BB700 3489409389 select size_for_estimate,                      siz                            e_factor * 100 f,                    estd_physical                            _read_time,                estd_physical_reads                                      from v$db_cache_advice where id = '3'                                      --以下查询通过某个游标cursor的address和hash value,查看cursor的执行计划,以及每一步操作的工作区的情况SQL> SELECT operation, options, object_name name, trunc(bytes/1024/1024) "input(MB)",  2  trunc(last_memory_used/1024) last_mem,  3  trunc(estimated_optimal_size/1024) optimal_mem,  4  trunc(estimated_onepass_size/1024) onepass_mem,  5  decode(optimal_executions, null, null,  6  optimal_executions||'/'||onepass_executions||'/'||  7  multipasses_executions) "O/1/M"  8  FROM V$SQL_PLAN p, V$SQL_WORKAREA w  9  WHERE p.address=w.address(+) 10  AND p.hash_value=w.hash_value(+) 11  AND p.id=w.operation_id(+) 12  AND p.address='00000000632EF5F0' 13  AND p.hash_value=3231842444;OPERATION            OPTIONS         NAME                  input(MB)   LAST_MEM OPTIMAL_MEM ONEPASS_MEM O/1/M-------------------- --------------- -------------------- ---------- ---------- ----------- ----------- ----------SORT                 ORDER BY                                                 0          72          72 0/0/0SORT                 JOIN                                                     0          72          72 0/0/0SORT                 JOIN                                                     0          72          72 0/0/0MERGE JOINSELECT STATEMENTFIXED TABLE          FULL            X$KCBWBPDFIXED TABLE          FULL            X$KCBSC

五、调整PGA_AGGREGATE_TARGET
        Oracle提供了2个非常重要的动态性能视图V$PGA_TARGET_ADVICE 和 V$PGA_TARGET_ADVICE_HISTOGRAM 来辅助我们调整 PGA_AGGREGATE_TARGET 参数。这样就不必按照经验来调整,这些视图提供了随着PGA_AGGREGATE_TARGET变大或者变小,PGA相关统计数据会发生什么变化。Oracle通过记录系统的工作量负载信息,然后模拟PGA_AGGREGATE_TARGET在不同的大小情况下,模拟的结果就是上面2个视图。
要自动生成PGA的建议性能视图,以下两个参数必须要设置:
1)、PGA_AGGREGATE_TARGET
2)、STATISTICS_LEVEL设置为typical或者all。如果是basic那么不会自动生成
注意模拟负载它不能安全包括你真实执行的所有要素,所以可能和调整后真实的性能数据不一致。所以,当你调整完PGA_AGGREGATE_TARGET,要密切关注相关性能数据。

--1、V$PGA_TARGET_ADVICE这个视图展示的是随着PGA_AGGREGATE_TARGET的调整变化,V$PGASTAT视图中的指标cache hit percentage和over allocation count会发生什么变化。SQL> SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,   2  ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,   3  ESTD_OVERALLOC_COUNT   4  FROM V$PGA_TARGET_ADVICE; TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT---------- -------------- --------------------       199             86                12097       399             95                 3857       798             99                   89      1196             99                    2      1595             99                    0      1914             99                    0      2233             99                    0      2552             99                    0      2871             99                    0      3190             99                    0      4785             99                    0      6380             99                    0      9570             99                    0     12760             99                    0

以上我测试环境的数据,看一张官方文档给的一张图表,和上面的数据没有关系


图表左侧阴影部分说明如果PGA_AGGREGATE_TARGET设置在这个大小,那么over allocation count将会是一个非零值, 也就是这个范围的PGA_AGGREGATE_TARGET不能满足PGA最小的内存需求,所以PGA不得不超过这个值。从阴影部分到500m,cache hit percentage上升很快,说明此时大部分的工作区work area能运行在optimal和one pass模式。当PGA_AGGREGATE_TARGET到达3GB时,cache hit percentage 是 83%,再增加1GB,cache hit percentage只上升了2%,所以3GB是个比较理想的大小。一般情况下,cache hit percentage至少要大于60%。在这个例子中,PGA_AGGREGATE_TARGET应该大于500M,越接近3GB越好,因为PGA的内存要考虑SGA的内存和实际可用物理内存。

调整步骤:
首先设置PGA_AGGREGATE_TARGET大于over-allocation区域。
其次,在可用内存足够情况下,尽量靠近optimal value。比如你有2G,那么设置2G,如果有10G,那就设置3G。
因为大部分统计数据都是自实例启动以来的累计数据,所以可以从2个快照中统计差值。
estd_overalloc_count = (difference in estd_overalloc_count between the two snapshots)
                                                         (difference in bytes_processed between the two snapshots)
estd_pga_cache_hit_percentage = -----------------------------------------------------------------
                                                          (difference in bytes_processed + extra_bytes_rw between the two snapshots )

--2、V$PGA_TARGET_ADVICE_HISTOGRAMV$PGA_TARGET_ADVICE_HISTOGRAM视图和V$SQL_WORKAREA_HISTOGRAM基本是一致的,只不过视图V$PGA_TARGET_ADVICE_HISTOGRAM多了PGA_AGGREGATE_TARGET列,表明了随着PGA_AGGREGATE_TARGET的变化,不同大小的工作区work area分别运行在optimal、one pass、multi pass mode的情况。下面这个查询展示的是PGA_AGGREGATE_TARGET设置为当前值的2倍,工作区的情况。SQL> SELECT LOW_OPTIMAL_SIZE/1024 low_kb, (HIGH_OPTIMAL_SIZE+1)/1024 high_kb,  2  estd_optimal_executions estd_opt_cnt,  3  estd_onepass_executions estd_onepass_cnt,  4  estd_multipasses_executions estd_mpass_cnt  5  FROM v$pga_target_advice_histogram  6  WHERE pga_target_factor = 2  7  AND estd_total_executions != 0  8  ORDER BY 1;    LOW_KB    HIGH_KB ESTD_OPT_CNT ESTD_ONEPASS_CNT ESTD_MPASS_CNT---------- ---------- ------------ ---------------- --------------         2          4     25577668                0              0        64        128        75673                0              0       128        256        16154                0              0       256        512        38432                0              0       512       1024       609588                0              0      1024       2048       445664                0              0      2048       4096       163800                0              0      4096       8192        24629                0              0      8192      16384         1224                0              0     16384      32768          859                0              0     32768      65536          221                0              0     65536     131072           33                0              0    131072     262144           29               35              0    262144     524288            0                9              0                           --3、V$SYSSTAT and V$SESSTAT上面两个视图包含了自实例或者会话启动以来工作区的运行情况,通过以下查询获取:SQL> SELECT name profile, cnt, decode(total, 0, 0, round(cnt*100/total)) percentage  2  FROM (SELECT name, value cnt, (sum(value) over ()) total  3  FROM V$SYSSTAT  4  WHERE name like 'workarea exec%');PROFILE                                 CNT PERCENTAGE-------------------------------- ---------- ----------workarea executions - optimal      26971730        100workarea executions - onepass            60          0workarea executions - multipass           0          0

内容来自:

Oracle® Database
Performance Tuning Guide
11
g Release 2 (11.2)


原创粉丝点击