Oracle - 数据库的内存调整

    Oracle数据库将信息存储在内存缓存和磁盘上,内存访问比磁盘访问快得多;与内存访问相比,磁盘访问(物理I/O)占用大量时间,也会增加所需的CPU资源,因此频繁访问的对象的数据请求通过内存执行会更有效率,而不是需要磁盘访问。

 

    影响性能的主要Oracle数据库内存缓存包括:数据库缓冲区缓存、重做日志缓冲区、共享池(含库缓存、数据字典缓存和服务器结果缓存等)、Java池、流池、大池、进程专用内存、内存列存储(IM列存储)等。

一、自动内存管理
    自动内存管理使Oracle数据库能够自动管理和调优数据库内存。在自动内存管理模式下,对共享全局区域(SGA)和程序全局区域(实例PGA)内存的管理完全由Oracle数据库处理。这个方法是最自动化且被Oracle强烈推荐的。
    如果禁用了自动内存管理,则Oracle数据库使用自动共享内存管理来管理SGA内存。在这种模式下,Oracle数据库会根据总SGA内存设置的目标大小自动将内存分配给各个SGA组件。
    如果禁用了自动内存管理和自动共享内存管理,就必须通过在SGA中调整单个内存池来手动管理SGA内存。这种模式能够完全控制SGA内存的分布,但它需要更大的工作量。
    如果禁用了自动内存管理,则Oracle数据库将使用自动PGA内存管理来管理PGA内存。在这种模式下,Oracle数据库根据总PGA内存设置的目标大小自动将内存分配到实例PGA中的工作区域。
    如果自动内存管理和自动PGA内存管理都被禁用,就必须通过调整PGA内存的部分来手动管理PGA内存。这种方法可能非常困难,因为工作负载总是在变化,Oracle强烈建议使用自动内存管理或自动PGA内存管理。        
    使用自动内存管理,需要设置MEMORY_TARGET和MEMORY_MAX_TARGET 初始化参数。在MEMORY_TARGET初始化参数中指定目标内存大小,再根据需要在SGA和实例PGA之间重新分配内存;此参数是动态的,因此可以随时更改其值,而无需重新启动数据库。而MEMORY_MAX_TARGET初始化参数指定的最大内存大小,该值用作MEMORY_TARGET值的限制;该参数是静态的,因此实例启动后无法更改其值。
        
二、自动SGA内存管理                

 

    受自动管理的组件

        自动共享内存管理简化了SGA的配置,自动分配内存用于以下内存池:数据库缓冲区缓存(默认池)、共享池、大型游泳池、Java池和流池,由 SGA_TARGET 参数控制。SGA_TARGET参数的值的变化会自动调整这些内存池的大小;如果将这些内存池设置为非零值,则自动共享内存管理将这些值作为最小值。 

    不自动管理的组件

        以下内存缓存是手动大小的组件,不受自动共享内存管理控制:
        重做日志缓冲区
            重做日志缓冲区使用 LOG_BUFFER 初始化参数,该参数的值以字节表示,实例启动后,重做日志缓冲区的大小不能修改。
            指标 REDO BUFFER ALLOCATION RETRIES 统计数据反映了在重做日志缓冲区中用户进程等待空间的次数。这个统计量的值应该在一个区间上接近于零,如果此值持续增加则意味着用户进程必须等待重做日志缓冲区中的空间可用。

 

 -- 使用V$SYSSTAT性能视图查询此统计数据。
 SQL> SELECT name, value FROM V$SYSSTAT WHERE name = 'redo buffer allocation retries';
 NAME                                                VALUE
 ---------------------------------------------  ----------
 redo buffer allocation retries                       2465

        其他缓存缓存(例如KEEP、RECYCLE等)
            KEEP池的大小使用 DB_KEEP_CACHE_SIZE 初始化参数,保持池的目的是在内存中保留对象,从而避免I/O操作。保存在保持池中的典型段是小的、经常使用的引用表。
            RECYCLE池的大小使用 db_restcle_cache_size 初始化参数,回收池的目的是保留被扫描很少或不经常被引用的片段
        固定SGA和其他内部分配

 

            固定的SGA和其他内部分配使用DB_nK_CACHE_SIZE初始化参数。

    当自动共享内存管理计算自动调优内存池的值时,分配给这些缓存的内存将从SGA_TARGET参数的值中扣除。修改SGA_TARGET参数的值可以使用 ALTER SYSTEM 命令。
    启用自动共享内存管理需要设置初始化参数 STATISTICS_LEVEL 的值为 TYPICAL 或 ALL,并将 SGA_TARGET 的值设置为非零的小于或等于SGA_MAX_SIZE初始化参数值的值,SGA_MAX_SIZE参数的值默认为所有SGA组件的聚合设置,且不能动态调整;禁用自动共享内存管理时将SGA_TARGET在实例启动时将参数值动态设置为零。    
                
三、手动共享内存管理
    如果系统没有使用自动内存管理或自动共享内存管理,那么您必须手动配置以下SGA组件的大小:
    数据库缓冲区缓存
        数据库缓冲区缓存的大小使用DB_CACHE_SIZE初始化参数

 

 

 -- 通过 V$DB_CACHE_ADVICE 咨询视图以返回缓冲池在各种大小的的I/O要求的预测
 SQL> COLUMN size_for_estimate          FORMAT 999,999,999,999 heading 'Cache Size (MB)'
 SQL> COLUMN buffers_for_estimate       FORMAT 999,999,999 heading 'Buffers'
 SQL> COLUMN estd_physical_read_factor  FORMAT 999.90 heading 'Estd Phys|Read Factor'
 SQL> COLUMN estd_physical_reads        FORMAT 999,999,999 heading 'Estd Phys| Reads'

 SQL> SELECT size_for_estimate, buffers_for_estimate, estd_physical_read_factor, estd_physical_reads
      FROM V$DB_CACHE_ADVICE WHERE name = 'DEFAULT' AND advice_status = 'ON'
      AND block_size = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size') ;
   
                                   Estd Phys     Estd Phys
  Cache Size (MB)      Buffers   Read Factor         Reads
 ----------------  -----------  ------------  ------------
               30        3,802         18.70   192,317,943  -- 10% of Current Size 
               60        7,604         12.83   131,949,536
               91       11,406          7.38    75,865,861
              121       15,208          4.97    51,111,658
              152       19,010          3.64    37,460,786
              182       22,812          2.50    25,668,196
              212       26,614          1.74    17,850,847
              243       30,416          1.33    13,720,149
              273       34,218          1.13    11,583,180
              304       38,020          1.00    10,282,475  -- Current Size 
              334       41,822           .93     9,515,878
              364       45,624           .87     8,909,026
              395       49,426           .83     8,495,039
              424       53,228           .79     8,116,496
              456       57,030           .76     7,824,764
              486       60,832           .74     7,563,180
              517       64,634           .71     7,311,729
              547       68,436           .69     7,104,280
              577       72,238           .67     6,895,122
              608       76,040           .66     6,739,731  -- 200% of Current Size 

        在本例中,当前缓存大小为204MB;如果缩小为212MB时物理读取的估计数量将增加到1.74倍即增加74%,因此不建议减少到212MB;如果增加到334MB可能会将读取量减少到0.93倍即减少7%,如果系统上有额外的内存可用且SGA_MAX_SIZE参数的值允许增量,则建议将默认缓冲区缓存池大小增加到334MB。
    共享池
        共享池的大小使用 SHARED_POOL_SIZE 初始化参数来调整大小。数据库使用共享池来缓存包括PL/SQL块和SQL语句、字典缓存数据、结果缓存数据和其他数据的文本和可执行形式。在调整共享池的大小时,目标是在库缓存中缓存多次执行的SQL语句,而不会过度分配内存。
        库缓存
            使用 $LIBRARYCACHE 视图来监视反映库缓存活动的统计信息。这些统计信息反映了最近数据库实例启动后的所有库高速缓存活动。每一行描述的项由NAMESPACE列的值标识

 

 SQL>  SELECT namespace, pins, pinhits, reloads, invalidations FROM V$LIBRARYCACHE ORDER BY namespace;

 NAMESPACE                           PINS    PINHITS    RELOADS INVALIDATIONS
 ----------------------------- ---------- ---------- ---------- -------------
 SQL AREA                        68042183   59896737     757840       1339997
 TABLE/PROCEDURE                 26946789   26923471       9349             0
 BODY                              306051     305853          3             0
 TRIGGER                           166104     166005          0             0
 INDEX                              16875      14608        676             0
 CLUSTER                             3077       3054          3             0
 DIRECTORY                             27          7          0             0
 QUEUE                              16368      16360          1             0
 JAVA SOURCE                           10          5          0             0
 JAVA RESOURCE                         10          5          0             0
 APP CONTEXT                           22         14          0             0

            计算库缓存的命中率:LibraryCacheHitRatio = sum(pinhits) / sum(pins)
            查看库缓存可用的内存量:

 

 SQL> SELECT * FROM V$SGASTAT WHERE name = 'free memory' AND pool = 'shared pool';        

 POOL         NAME                            BYTES
 ------------ -------------------------- ----------
 shared pool  free memory                4841986312

        字典缓存
            数据库实例启动时,数据字典缓存不包含任何数据。因此,发出的任何SQL语句都可能导致缓存未命中。随着更多数据被读入缓存,缓存未命中的可能性降低。最终,数据库达到稳定状态,其中最常用的字典数据在缓存中

 

 -- 查询以查看视应用程序运行期间的统计数据
 SQL> SELECT parameter, sum(gets), sum(getmisses), 100*sum(gets - getmisses) / sum(gets) pct_succ_gets, sum(modifications) updates
      FROM V$ROWCACHE WHERE gets > 0 GROUP BY parameter;
 PARAMETER                         SUM(GETS) SUM(GETMISSES) PCT_SUCC_GETS    UPDATES
 -------------------------------- ---------- -------------- ------------- ----------
 dc_constraints                         1888            633    66.4724576       1888
 outstanding_alerts                    17075          16149    5.42313324         11
 dc_awr_control                        30396            486    98.4011054        452
 sch_lj_objs                             166             32    80.7228916          0
 sch_lj_oids                            2433             58    97.6161118          0
 dc_objects                        103102954          27213     99.973606       6167
 dc_table_scns                           178            178             0          0
 qmtmrciq_cache_entries                    1              1             0          0
 qmtmrctq_cache_entries                 1824           1198    34.3201754          0
 dc_users                           55585406            398     99.999284          0
 qmrc_cache_entries                        7              7             0          0 

        查询结果缓存
            如果使用SGA_TARGET初始化参数即自动共享池管理,数据库默认将SGA_TARGET参数值的0.50%分配给结果缓存,
            使用SHARED_POOL_SIZE初始化参数即手动共享池管理,则数据库默认将1%的共享池大小分配给结果缓存,可以通过初始化参数RESULT_CACHE_MAX_SIZE设置为所需的大小,禁用服务器结果缓存时将此参数设置为0即可

 

 -- 通过执行 DBMS_RESULT_CACHE.MEMORY_REPORT 查看结果缓存的使用情况
 SQL> SET SERVEROUTPUT ON
 SQL> EXECUTE DBMS_RESULT_CACHE.MEMORY_REPORT
 R e s u l t   C a c h e   M e m o r y   R e p o r t
 [Parameters]
 Block Size          = 1K bytes
 Maximum Cache Size  = 671104K bytes (671104 blocks)
 Maximum Result Size = 33555K bytes (33555 blocks)
 [Memory]
 Total Memory = 12768 bytes [0.000% of the Shared Pool]
 ... Fixed Memory = 12768 bytes [0.000% of the Shared Pool]
 ... Dynamic Memory = 0 bytes [0.000% of the Shared Pool]

PL/SQL 过程已成功完成。

    保留池
        数据库实例使用保留池来存储大型对象。保留池的大小使用 SHARED_POOL_RESERVED_SIZE 初始化参数来设置,该参数的默认值是 SHARED_POOL_SIZE 参数的5%,通常不需要更改这个默认值,而一般的调整修改到10%即足够。
        调整参数时使用 V$SHARED_POOL_RESERVED 视图的统计信息做参考,在具有足够空闲内存的系统上 REQUEST_MISSES 的统计值应该为零,在受操作系统内存的限制的系统上目标是使REQUEST_FAILURES的统计值为0或不增加,否则应增大SHARED_POOL_RESERVED_SIZE的值

 

 SQL> select REQUEST_FAILURES,REQUEST_MISSES from V$SHARED_POOL_RESERVED;

 REQUEST_FAILURES REQUEST_MISSES
 ---------------- --------------
                0              0

    内存中列存储
        内存列存储(IM列存储)是12C开始的一个可选的静态SGA池,可以为表、物化视图、分区和表空间等数据库对象启用内存列存储,使之存储为针对快速扫描进行优化的特殊的列状格式。使用 INMEMORY_SIZE 初始化参数设置它的大小,该参数的默认值为0即不使用内存中的列存储,要启用时设置该参数为非零值。在设置内存中列存储的大小之后,必须重新启动数据库实例,以便将数据库对象存储在其中。
        使用内存中的列存储需要大量的内存,为减少内存需求可以为要存储在内存列存储中的每个数据库对象指定压缩方法,搞压缩可以减少内存但不会提高更大的性能优势,需要平衡性能的优势与可用的内存。内存中的列存储支持的压缩方法包括 不压缩数据(NO MEMCOMPRESS)、优化DML操作的数据并最少压缩内存列存储数据(MEMCOMPRESS FOR DML)以及逐级更高压缩的四个(MEMCOMPRESS FOR QUERY LOW、MEMCOMPRESS FOR QUERY HIGH、MEMCOMPRESS FOR CAPACITY LOW、MEMCOMPRESS FOR CAPACITY HIGH)压缩方法。

 

 -- 将内存列存储的大小设置为100GB的示例
 SQL> ALTER SYSTEM SET INMEMORY_SIZE = 100G;
        
 -- 为oe.product_information表启用列存并指定MEMCOMPRESS FOR CAPACITY HIGH压缩方法
 SQL> ALTER TABLE oe.product_information INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;    

    大池
        数据库实例使用大池来存储共享服务器体系结构的客户端进程的会话信息、并行查询的并行执行消息缓冲区和恢复管理器的缓存I/O缓冲区。
        大型池的大小使用 LARGE_POOL_SIZE 初始化参数。 
    Java池
        数据库实例使用Java池来存储所有会话特定的Java代码和和Java虚拟机中的数据。
        Java池的大小使用 JAVA_POOL_SIZE 初始化参数来设置。
    流池
        数据库实例使用流池来存储缓冲队列消息并为Oracle流捕获进程和应用程序提供内存。
        流池的大小使用 STREAMS_POOL_SIZE 初始化参数来设置。
    这些参数的值可以使用ALTER SYSTEM语句动态配置,除了INMEMORY_SIZE参数。INMEMORY_SIZE参数是一个静态参数,因此在使用ALTER SYSTEM语句更改后必须重新启动数据库实例以使更改生效。

四、自动PGA内存管理
    自动PGA内存管理简化并改进了PGA内存的分配方式,默认情况下,启用PGA内存管理。在这种模式下,Oracle数据库会根据SGA内存大小的20%,动态调整专用于工作区域的PGA内存部分,从而自动调整PGA的大小。
    可以通过将 PGA_AGGREGATE_TARGET 初始化参数的值设置为0来禁用自动PGA内存管理。禁用自动PGA内存管理时,工作区的最大大小可以使用相关 *_AREA_SIZE 参数进行调整。
    视图 V$PGASTAT 提供有关PGA内存使用情况和自动PGA内存管理器的实例级的统计信息。

 

SQL> SELECT * FROM V$PGASTAT;

NAME                                           VALUE UNIT
----------------------------------------- ---------- -------
aggregate PGA target parameter            1.0491E+10 bytes    -- 参数 PGA_AGGREGATE_TARGET 的当前值
aggregate PGA auto target                 8221344768 bytes    -- 在自动模式下可用于运行工作区域的PGA内存量
global memory bound                       1049098240 bytes    -- 自动模式下执行的工作区域的最大大小
total PGA inuse                           1356447744 bytes
total PGA allocated                       1845280768 bytes    -- 实例分配的当前的PGA内存量
maximum PGA allocated                     8022375424 bytes
total freeable PGA memory                  263258112 bytes    -- 可以被释放的分配了的PGA内存量
process count                                    478
max processes count                              506
PGA memory freed back to OS               4.5025E+12 bytes
total PGA used for auto workareas             456704 bytes    -- 自动模式下运行的工作区域当前消耗的PGA内存量
maximum PGA used for auto workareas       4897979392 bytes
total PGA used for manual workareas                0 bytes
maximum PGA used for manual workareas        1085440 bytes
over allocation count                              0
bytes processed                           6.6557E+12 bytes    -- 实例启动以来内存密集型SQL操作符处理的字节数
extra bytes read/written                  4.0586E+12 bytes    -- 工作区域无法最佳运行时额外传递过程中处理的字节数
cache hit percentage                           62.11 percent  -- 缓存命中的百分比
recompute count (total)                       477574

    视图 V$PROCESS 监视连接到数据库实例的每个Oracle进程,每一行一个进程。

 

SQL> select PROGRAM, PGA_USED_MEM, PGA_ALLOC_MEM, PGA_FREEABLE_MEM, PGA_MAX_MEM from V$PROCESS;

PROGRAM                          PGA_USED_MEM  PGA_ALLOC_MEM  PGA_FREEABLE_MEM       PGA_MAX_MEM
进程                               使用的内存   已分配的内存      可回收的内存  分配过的最大内存
-------------------------------  ------------  -------------  ----------------  ----------------
PSEUDO                                      0              0                 0                 0
oracle@tyzf-db2 (PMON)                1005330        1133794                 0           1133794
oracle@tyzf-db2 (PSP0)                 984538        1117378                 0           1117378
oracle@tyzf-db2 (VKTM)                 980450        1117378                 0           1117378
oracle@tyzf-db2 (GEN0)                1006826        1117378                 0           1117378
oracle@tyzf-db2 (DIAG)                6242618        6425794                 0           6425794
oracle@tyzf-db2 (PING)                1058762        1182914                 0           1182914
oracle@tyzf-db2 (ACMS)                 988562        1117378                 0           1117378
oracle@tyzf-db2 (DIA0)               33028618       38652450           4521984          38652450
oracle@tyzf-db2 (LMON)                7581842        8588482                 0           8588482
oracle@tyzf-db2 (LMD0)               12101250       12455106                 0          12455106
oracle@tyzf-db2                       2154602        2493634                 0           2493634
oracle@tyzf-db2 (TNS V1-V3)           1008010        1265186                 0           1265186
oracle@tyzf-db2 (J001)                 927898        1903810            524288           1903810
oracle@tyzf-db2                       3615346        4852930            983040           7867586
oracle@tyzf-db2                       2086209        2886850            196608           2886850
oracle@tyzf-db2                       1630090        2804258            917504           5163554

    视图 V$PROCESS_MEMORY 按每个Oracle进程的命名组件类别显示动态PGA内存使用情况,组包含SQL、PL/SQL、Freeable、Other等

 

SQL> select * from V$PROCESS_MEMORY;

       PID    SERIAL# CATEGORY         ALLOCATED       USED MAX_ALLOCATED
---------- ---------- --------------- ---------- ---------- -------------
         2          1 PL/SQL                2008        224          2008
         2          1 Other              1131786                  1131786
         3          1 PL/SQL                2008        224          2008
         3          1 Other              1115370                  1115370
         4          1 PL/SQL                2008        224          2008
         4          1 Other              1115370                  1115370
        51        149 SQL                  25064       7560        254728
        51        149 PL/SQL                2008        224          2008
        51        149 Freeable            131072          0
        51        149 Other              2383970                  2383970

    视图 V$SQL_WORKAREA 为每个加载的游标维护累积的工作区域统计数据。通过该视图查找出最耗内存的工作区,通过关联v$sql即可关联出游标的具体信息:

 

SQL> SELECT * FROM   (
         SELECT sql_id, workarea_address, operation_type, policy, estimated_optimal_size FROM V$SQL_WORKAREA ORDER BY estimated_optimal_size DESC)
     WHERE ROWNUM <= 10;

SQL_ID        WORKAREA_ADDRESS OPERATION_TYPE    POLICY    ESTIMATED_OPTIMAL_SIZE
------------- ---------------- ----------------- --------- ----------------------
2kkw0w4ss3rk3 070000196D7E9C28 SORT (v2)         AUTO                  4.1737E+10
a0vcv0jnh19t2 0700001D7EA6B108 SORT (v2)         AUTO                  1.1912E+10
2kkw0w4ss3rk3 0700001ABCD9D1E8 SORT (v2)         AUTO                  8235171840
cmdhha47fgpxs 0700001ADDE0B378 SORT (v2)         AUTO                  5638367232
3ms76daaz787y 070000194EE8EDE0 SORT (v2)         AUTO                  5349998592
9n29nxtvtnphb 0700001DAFE2E358 HASH-JOIN         AUTO                  2147482624
cmdhha47fgpxs 0700001ADDE0B3E0 HASH-JOIN         AUTO                  2147482624
51gvt76q05956 0700001D5F851CA0 SORT (v2)         AUTO                  2086549504
gxyddq0kt2rfg 0700001C05293AB8 SORT (v2)         AUTO                  2086549504
gxyddq0kt2rfg 0700001AACE5E130 SORT (v2)         AUTO                  2086549504



 

你可能感兴趣的:(DB)