• 《Administrator's Guide》之Managing Memory


    Automatic Memory Management

    1. 如果要启动Automatic Memory Management,如何确定MEMORY_TARGET的值呢?

        1> 在SQL*Plus下show parameter target,结果如下:

    SQL> show parameter target
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    archive_lag_target                   integer     0
    db_flashback_retention_target        integer     1440
    fast_start_io_target                 integer     0
    fast_start_mttr_target               integer     0
    memory_max_target                    big integer 0
    memory_target                        big integer 0
    parallel_servers_target              integer     256
    pga_aggregate_target                 big integer 4779M
    sga_target                           big integer 14368M

       2> 确定maximum PGA allocated的值

    SQL> select value/1024/1024 from v$pgastat where name='maximum PGA allocated';
    
    VALUE/1024/1024
    ---------------
         4331.59961

        3> memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)

             在本例中,则memory_target至少为14368+4779=19147M

    2. 如何优化Memory Target Size,SGA Target Size,PGA Target Size。

       可分别查询V$MEMORY_TARGET_ADVICE,V$SGA_TARGET_ADVICE,V$PGA_TARGET_ADVICE表,下面以V$SGA_TARGET_ADVICE为例。

    SQL> select * from v$sga_target_advice order by sga_size;
     
      SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS
    ---------- --------------- ------------ ------------------- -------------------
           290              .5       448176              1.6578             1636103
           435             .75       339336              1.2552             1636103
           580               1       270344                   1             1201780
           725            1.25       239038               .8842              907584
           870             1.5       211517               .7824              513881
          1015            1.75       201866               .7467              513881
          1160               2       200703               .7424              513881

        SGA_SIZE_FACTOR和ESTD_DB_TIME_FACTOR为1的行对应的是当前SGA的值,该本例中,当前SGA的SIZE为580M。可根据ESTD_DB_TIME和ESTD_PHYSICAL_READS的期望值来相应调整SGA的值。

    3. 关于MEMORY_TARGET和MEMORY_MAX_TARGET的关系

    MEMORY_TARGET是动态参数,可在数据库运行过程中动态修改,MEMORY_MAX_TARGET是静态参数,只有重启数据库才能生效。MEMORY_TARGET的值不能超过MEMORY_MAX_TARGET。设置MEMORY_MAX_TARGET有两个好处:一、防止意外将MEMORY_TARGET的设置得过高。二、为将来增大MEMORY_TARGET的值保留空间。

    在pfile中,如果你忽略了MEMORY_MAX_TARGET的值,只设置了MEMORY_TARGET的值,则MEMORY_MAX_TARGET默认将设置为MEMORY_TARGET的值。如果只设置了MEMORY_MAX_TARGET的值,而没有设置MEMORY_TARGET的值,则MEMORY_TARGET默认为0。

    4. 可通过v$memory_dynamic_components查看内存各组件的信息

    SQL> select component,current_size,min_size,max_size,user_specified_size from v$memory_dynamic_components;
    
    COMPONENT                      CURRENT_SIZE   MIN_SIZE     MAX_SIZE USER_SPECIFIED_SIZE
    ------------------------------ ------------ ----------   ---------- -------------------
    shared pool                        92274688   41943040     92274688                   0
    large pool                          8388608    8388608     71303168                   0
    java pool                           4194304    4194304      4194304                   0
    streams pool                              0          0            0                   0
    SGA Target                        205520896  205520896    205520896                   0
    DEFAULT buffer cache               92274688   37748736    100663296                   0
    KEEP buffer cache                         0         0             0                   0
    RECYCLE buffer cache                      0         0             0                   0
    DEFAULT 2K buffer cache                   0         0             0                   0
    DEFAULT 4K buffer cache                   0         0             0                   0
    DEFAULT 8K buffer cache                   0         0             0                   0
    
    COMPONENT                      CURRENT_SIZE   MIN_SIZE     MAX_SIZE  USER_SPECIFIED_SIZE
    ------------------------------ ------------ ----------   ----------  -------------------
    DEFAULT 16K buffer cache                  0          0            0                   0
    DEFAULT 32K buffer cache                  0          0            0                   0
    Shared IO Pool                            0          0            0                   0
    PGA Target                        109051904  109051904    109051904                   0
    ASM Buffer Cache                          0          0            0                   0
    
    16 rows selected.

    5. 如何启动Automatic Memory Management,设置如下:

    ALTER SYSTEM SET MEMORY_TARGET = nM;
    ALTER SYSTEM SET SGA_TARGET = 0;
    ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;

    注意:如果SGA_TARGET和PGA_AGGREGATE_TARGET没有设置为0,则设置的值将是其最小值。

    SGA

    6. SGA各组件的分配以granule为单位,而granule的大小以SGA_MAX_SIZE为衡量标准,具体如下:

    关于granule的大小,可通过以下语句进行查询

    SQL> select * from v$sgainfo where name='Granule Size';
    
    NAME                                  BYTES RES
    -------------------------------- ---------- ---
    Granule Size                        4194304 No

    注意:SGA给各组件分配空间,都是granule的整数倍,譬如,如果你的granule size是4M,你将DB_CACHE_SIZE的值设置为10M,则SGA实际为DB_CACHE_SIZE分配的内存空间是12M。

    7. 关于SGA_MAX_SIZE

    SGA_MAX_SIZE是静态参数,具体说明和默认值如下所示:

    8. ASMM

    Automatic shared memory management通过设置SGA_TARGET的值来启动。在SGA各组件中,有些组件可通过ASMM自动分配内存,有些组件必须显性指定值。具体如下:

    Automatically Sized SGA Components and Corresponding Parameters

    以下参数SGA可自动调节,如果启动了ASMM,如下值必须设置为0,倘若不是0,则表示其最小值

    Manually Sized SGA Components that Use SGA_TARGET Space--以下参数只能手动配置内存

    9. 在实际应用中,SGA应该全部放在内存中,如果有一部分放在虚拟内存中,因为分页问题,则整个数据库的性能将受到显著影响。

    10. 如果要启动ASMM,如何确定SGA_TARGET的值?

    SELECT (
       (SELECT SUM(value) FROM V$SGA) -
       (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)
       ) "SGA_TARGET"
    FROM DUAL;

    11. Buffer Cache

    Buffer cache的大小影响数据库的性能,较大的buffer cache虽然能减少物理读和写的次数,但由于它占用了大量的内存,可能会导致分页和交换。

    Oracle支持不同大小的block size,在创建表空间时,如果指定了非标准的block size,则必须设置相应的DB_nK_CACHE_SIZE的值。注意,system表空间使用的是标准块,标准块的大小可通过如下语句查看:

    SQL> show parameter db_block_size
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_block_size                        integer     8192

    Oracle支持5种不同大小的block size,相应的cache值,可通过以下参数设置:

    DB_2K_CACHE_SIZE
    DB_4K_CACHE_SIZE
    DB_8K_CACHE_SIZE
    DB_16K_CACHE_SIZE
    DB_32K_CACHE_SIZE

    注意:DB_nK_CACHE_SIZE不能用于设定标准块的cache值,标准块的cache size是由db_cache_size决定的。在本例中,标准块的大小是8k,所以设置DB_8K_CACHE_SIZE的值将报以下错误:

    SQL> alter system set db_8k_cache_size=10m;
    alter system set db_8k_cache_size=10m
    *
    ERROR at line 1:
    ORA-32017: failure in updating SPFILE
    ORA-00380: cannot specify db_8k_cache_size since 8K is the standard block size

    32k的block size只在64位操作系统中有效。

    12. Buffer Pools

    buffer cache包含三种池:KEEP池、RECYCLE池、DEFAULT池。其中KEEP池是将对象的数据永久保存在内存中,RECYCLE池是一旦数据不需要,就从内存中剔除。DEFAULT池是默认的。KEEP池和RECYCLE池的大小分别根据DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE两个参数来设置。这三种池只支持标准块,对于非标准块,只支持DEFAULT池。

    13. 如果要手动管理PGA,需要显性设定以下值。

    SORT_AREA_SIZE, HASH_AREA_SIZE, BITMAP_MERGE_AREA_SIZE, CREATE_BITMAP_AREA_SIZE。

  • 相关阅读:
    注解
    LeedCode刷题:337.打家劫舍Ⅲ
    计蒜客:踏青(DFS)
    C++中memset()用法
    DFS深度优先搜索(附例题)
    计蒜客:网络交友:map+set+并查集
    JavaString类中valueOf和parseInt的区别
    Leedcode刷题 539. 最小时间差
    ps换衣服颜色
    hashmap的一些总结
  • 原文地址:https://www.cnblogs.com/ivictor/p/4480905.html
Copyright © 2020-2023  润新知