Oracle 通过不段的完善,目前SGA已经通过Oracle内部组件ASMM进行自动动态的管理内存的分配

如果人工修改这些参数,需要注意以下3点:

  1. 修改的内存大小必须是粒度大小的整数倍。否则Oracle 会自动向上取整。

  2. sga的总大小不能超过sga_max_size.

  3. sga最低配置为3个粒度,一个粒度用于固定SGA,一个粒度用于缓冲区高速缓冲,一个粒度用于共享池。

伴随SGA动态管理的新特性,Oracle推出一系列的内存设置建议功能,同时引入一系列的动态性能视图。

SQL> select tname from tab where tname like '%ADVICE%';
TNAME
--------------------------------------------------------------------------------
WRH$_STREAMS_POOL_ADVICE
WRH$_SHARED_POOL_ADVICE
WRH$_SGA_TARGET_ADVICE
WRH$_PGA_TARGET_ADVICE
WRH$_MTTR_TARGET_ADVICE
WRH$_MEMORY_TARGET_ADVICE
WRH$_JAVA_POOL_ADVICE
WRH$_DB_CACHE_ADVICE_BL
WRH$_DB_CACHE_ADVICE
V_$STREAMS_POOL_ADVICE
V_$SHARED_POOL_ADVICE
V_$SGA_TARGET_ADVICE
V_$PX_BUFFER_ADVICE
V_$PGA_TARGET_ADVICE_HISTOGRAM
V_$PGA_TARGET_ADVICE
V_$MTTR_TARGET_ADVICE
V_$MEMORY_TARGET_ADVICE
V_$JAVA_POOL_ADVICE
V_$DB_CACHE_ADVICE
SAM_SPARSITY_ADVICE
GV_$STREAMS_POOL_ADVICE
GV_$SHARED_POOL_ADVICE
GV_$SGA_TARGET_ADVICE
GV_$PX_BUFFER_ADVICE
GV_$PGA_TARGET_ADVICE
GV_$PGATARGET_ADVICE_HISTOGRAM
GV_$MTTR_TARGET_ADVICE
GV_$MEMORY_TARGET_ADVICE
GV_$JAVA_POOL_ADVICE
GV_$DB_CACHE_ADVICE
DBA_HIST_STREAMS_POOL_ADVICE
DBA_HIST_SHARED_POOL_ADVICE
DBA_HIST_SGA_TARGET_ADVICE
DBA_HIST_PGA_TARGET_ADVICE
DBA_HIST_MTTR_TARGET_ADVICE
DBA_HIST_MEMORY_TARGET_ADVICE
DBA_HIST_JAVA_POOL_ADVICE
DBA_HIST_DB_CACHE_ADVICE

这类建议也受初始化参数的控制:

V_$DB_CACHE_ADVICE
SQL> show parameter db_cache
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice                      string      OFF
V_$SHARED_POOL_ADVICE
SQL> show parameter statistics_level
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
statistics_level                     string      TYPICAL

通过视图v$statistics_level可以查看该参数影响范围:

SQL> select statistics_name,session_status,system_status,activation_level,session_settable from v$statistics_level;
STATISTICS_NAME                        SESSION_ SYSTEM_S ACTIVAT SES
-------------------------------------- -------- -------- ------- ---
Buffer Cache Advice                    DISABLED DISABLED TYPICAL NO
MTTR Advice                            ENABLED  ENABLED  TYPICAL NO
Timed Statistics                       ENABLED  ENABLED  TYPICAL YES
Timed OS Statistics                    DISABLED DISABLED ALL     YES
Segment Level Statistics               ENABLED  ENABLED  TYPICAL NO
PGA Advice                             ENABLED  ENABLED  TYPICAL NO
Plan Execution Statistics              DISABLED DISABLED ALL     YES
Shared Pool Advice                     ENABLED  ENABLED  TYPICAL NO
Modification Monitoring                ENABLED  ENABLED  TYPICAL NO
Longops Statistics                     ENABLED  ENABLED  TYPICAL NO
Bind Data Capture                      ENABLED  ENABLED  TYPICAL NO
Ultrafast Latch Statistics             ENABLED  ENABLED  TYPICAL NO
Threshold-based Alerts                 ENABLED  ENABLED  TYPICAL NO
Global Cache Statistics                ENABLED  ENABLED  TYPICAL NO
Active Session History                 ENABLED  ENABLED  TYPICAL NO
Undo Advisor, Alerts and Fast Ramp up  ENABLED  ENABLED  TYPICAL NO
Streams Pool Advice                    ENABLED  ENABLED  TYPICAL NO
Time Model Events                      ENABLED  ENABLED  TYPICAL YES
Plan Execution Sampling                ENABLED  ENABLED  TYPICAL YES
Automated Maintenance Tasks            ENABLED  ENABLED  TYPICAL NO
SQL Monitoring                         ENABLED  ENABLED  TYPICAL YES
Adaptive Thresholds Enabled            ENABLED  ENABLED  TYPICAL NO
V$IOSTAT_* statistics                  ENABLED  ENABLED  TYPICAL NO

可以尝试STATISTICS_LEVEL三个等级basic、typical、all来比对,动态视图v$statistics_level的变化。另外Timed Statistics还受系统参数timed_statistics的控制

SQL> show parameter timed_statistics
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
timed_statistics                     boolean     TRUE

当进行动态参数修改时,修改session会出于等待状态,等待事件为background parameter adjustment,查看shared_pool大小建议

SQL> select shared_pool_size_for_estimate spsfe,shared_pool_size_factor spsf,estd_lc_size els,estd_lc_memory_objects elo,estd_lc_time_saved elts,estd_lc_time_saved_factor eltsf,estd_lc_memory_object_hits from v$shared_pool_advice;
     SPSFE       SPSF        ELS        ELO       ELTS      ELTSF ESTD_LC_MEMORY_OBJECT_HITS
---------- ---------- ---------- ---------- ---------- ---------- --------------------------
       256      .2857         41       2690        102          1                      25331
       384      .4286         43       2810        102          1                      26467
       512      .5714         43       2810        102          1                      26467
       640      .7143         43       2810        102          1                      26467
       768      .8571         43       2810        102          1                      26467
       896          1         43       2810        102          1                      26467
      1024     1.1429         43       2810        102          1                      26467
      1152     1.2857         43       2810        102          1                      26467
      1280     1.4286         43       2810        102          1                      26467
      1408     1.5714         43       2810        102          1                      26467
      1536     1.7143         43       2810        102          1                      26467
      1664     1.8571         43       2810        102          1                      26467
      1792          2         43       2810        102          1                      26467

调整shared_pool_size大小,因为我这里不在业务环境下调整,速度非常快不存在等待事件,自然也没有锁的参数,我把书中的方法记录下来,以便后续查看:

SQL> alter system set shared_pool_size=896M scope=both;
SQL> select sid,seq#,event,seconds_in_wait,state from v$session_wait where event='background parameter adjustment';
SQL> select * from v$lock where sid=(select sid from v$session_wait where event='background parameter adjustment');

以上的调整方式主要适用于10G以前的版本,10G后,Oracle引入sga_target参数对SGA内存分配进行自动管理,但sga_target大小不能超过sga_max_size的大小。

SQL> show parameter sga_max_size
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 6464M
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 0
SQL> alter system set sga_target=7000M scope=both;
alter system set sga_target=7000M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00823: Specified value of sga_target greater than sga_max_size
SQL> alter system set sga_target=3000M scope=both;
System altered.

自动调整以下组成部分:

  • Buffer Cache

  • Shared Pool

  • Java Pool

  • Large Pool

自动管理需要statistics_level参数设置为typical或all,而以下几个组成部分需手动调整:

  • 非标准BLOCK_SIZE(DB_nk_CACHE_SIZE)

  • Keep/Recycle Buffer Cache

  • Redo Log Buffer

  • Stream Pool

Oracle为自动管理内存引入了一个新后台进程MMAN,从告警日志可以看到该进程启动的顺序在DBWR和LGWR进程之前。

Fri Feb 20 14:57:45 2015

MMAN started with pid=9, OS id=6295

Fri Feb 20 14:57:45 2015

DBW0 started with pid=10, OS id=6297

Fri Feb 20 14:57:45 2015

LGWR started with pid=11, OS id=6299

也可以通过v$process视图查看这些进程在系统中的信息

SQL> select pid,spid,program from v$process;
       PID SPID                     PROGRAM
---------- ------------------------ ------------------------------------------------
         1                          PSEUDO
         2 6279                     oracle@021Y-SH-BKAP (PMON)
         3 6281                     oracle@021Y-SH-BKAP (VKTM)
         4 6285                     oracle@021Y-SH-BKAP (GEN0)
         5 6287                     oracle@021Y-SH-BKAP (DIAG)
         6 6289                     oracle@021Y-SH-BKAP (DBRM)
         7 6291                     oracle@021Y-SH-BKAP (PSP0)
         8 6293                     oracle@021Y-SH-BKAP (DIA0)
         9 6295                     oracle@021Y-SH-BKAP (MMAN)
        10 6297                     oracle@021Y-SH-BKAP (DBW0)
        11 6299                     oracle@021Y-SH-BKAP (LGWR)
        12 6301                     oracle@021Y-SH-BKAP (CKPT)
        13 6303                     oracle@021Y-SH-BKAP (SMON)
        14 6305                     oracle@021Y-SH-BKAP (RECO)
        15 6307                     oracle@021Y-SH-BKAP (MMON)
        16 6309                     oracle@021Y-SH-BKAP (MMNL)
        17 6311                     oracle@021Y-SH-BKAP (D000)
        18 6313                     oracle@021Y-SH-BKAP (S000)
        19 14053                    oracle@021Y-SH-BKAP (W000)
        20 6348                     oracle@021Y-SH-BKAP (ARC0)
        21 6351                     oracle@021Y-SH-BKAP (ARC1)
        22 6353                     oracle@021Y-SH-BKAP (ARC2)
        23 6355                     oracle@021Y-SH-BKAP (ARC3)
        24 6359                     oracle@021Y-SH-BKAP (QMNC)
        25 14902                    oracle@021Y-SH-BKAP (J000)
        26 6373                     oracle@021Y-SH-BKAP (CJQ0)
        27 14904                    oracle@021Y-SH-BKAP (J001)
        28 6915                     oracle@021Y-SH-BKAP (SMCO)
        29 6381                     oracle@021Y-SH-BKAP (Q000)
        30 6383                     oracle@021Y-SH-BKAP (Q001)
        31 7915                     oracle@021Y-SH-BKAP (TNS V1-V3)

而真正决定各组成部分大小,则由新引入的隐藏参数来决定:

SQL> select x.ksppinm name,y.ksppstvl value,x.ksppdesc describ from x$ksppi x,x$ksppcv y where x.inst_id=userenv('Instance') and y.inst_id=userenv('Instance') and x.indx=y.indx and x.ksppinm like '%pool_size%';
NAME                 VALUE                DESCRIB
-------------------- -------------------- ----------------------------------------
_NUMA_pool_size      Not specified        aggregate size in bytes of NUMA pool
__shared_pool_size   3221225472           Actual size in bytes of shared pool
shared_pool_size     939524096            size in bytes of shared pool
__large_pool_size    67108864             Actual size in bytes of large pool
large_pool_size      0                    size in bytes of large pool
__java_pool_size     67108864             Actual size in bytes of java pool
java_pool_size       0                    size in bytes of java pool
__streams_pool_size  0                    Actual size in bytes of streams pool
streams_pool_size    0                    size in bytes of the streams pool
_io_shared_pool_size 4194304              Size of I/O buffer pool from SGA
_backup_io_pool_size 1048576              memory to reserve from the large pool
__shared_io_pool_siz 0                    Actual size of shared IO pool
e
_shared_io_pool_size 0                    Size of shared IO pool
global_context_pool_                      Global Application Context Pool Size in
size                                      Bytes
olap_page_pool_size  0                    size of the olap page pool in bytes
_trace_pool_size                          trace pool size in bytes