首页 > 代码库 > Oracle内存管理(之五)

Oracle内存管理(之五)

【深入解析--eygle】学习笔记

1.4. 2其他内存组件

Large Pool-大池是SGA的一个可选组件,通常用于共享服务器模式(MTS)、 并行计算或

RMAN的备份恢复等操作。

Java Pool-Java池主要用于JVM等Java选件。

Streams Pool-Streams pool是Oracle10g引入的概念,为Oracle的Streams功能所使用,如果不定义该参数,这部分内存将从Shread Pool中分配

 

对于SGA各部分内存分配,可以从数据库的视图中查询得到:

 

 

17:46:03 sys@felix SQL>select * from v$sga;

 

NAME                                          VALUE

--------------------------------------------------

Fixed Size                                  2228944

Variable Size                             335547696

Database Buffers                           75497472

Redo Buffers                                4272128

 

18:00:20 sys@felix SQL>

 

在Oracle9i中,Variable  Size  包括shared_pool_size,java_pool_size和large_pool_size部分,SGA_MAX_SIZE去除db_cache_size部分也被归入可变部分,所以很多时候我们看到的可变部分内存要远高于可变内存组件大小;

 

Redo Buffers指日志缓冲区分配的内存大小,这个参数值通常比log_buffers参数设置略大;因为Log  Buffer并非按照数据块大小分配,在内存中通常需要设置保护页对Log Buffer进行保护。

 

18:00:20 sys@felix SQL>select * from v$sgainfo;

 

NAME                                          BYTESRESIZE

-------------------------------------------------- ------

Fixed SGA Size                              2228944 No

Redo Buffers                                4272128 No

Buffer Cache Size                          75497472 Yes

Shared Pool Size                          171966464 Yes

Large Pool Size                             4194304 Yes

Java Pool Size                              4194304 Yes

Streams Pool Size                           8388608 Yes

Shared IO Pool Size                               0 Yes

Granule Size                                4194304 No

Maximum SGA Size                          417546240 No

Startup overhead in Shared Pool            65418776 No

Free SGA Memory Available                 146800640

 

12 rows selected.

 

18:06:23 sys@felix SQL>

 

 

当前SGA的分配和使用具体信息我们还可以通过V$SGASTAT视图查询得到:

 

select *

  FROM(SELECT *

         FROM v$sgastat

        WHERE pool = ‘shared pool‘

        ORDER BY BYTES DESC)

 WHERE ROWNUM<= 5

 

 

18:06:23 sys@felix SQL>select *

18:08:05  2    FROM (SELECT *

18:08:05  3            FROM v$sgastat

18:08:05  4           WHERE pool = ‘sharedpool‘

18:08:05  5           ORDER BY BYTES DESC)

18:08:05  6   WHERE ROWNUM <= 5;

 

POOL                    NAME                                          BYTES

---------------------------------------------------------------- ----------

shared pool              free memory                                30868336

shared pool              SQLA                                       21540248

shared pool              KGLH0                                      19496600

shared pool              row cache                                   7593704

shared pool              PLMCD                                       6275624

 

18:08:07 sys@felix SQL>


1.4.3 SGA 与共享内存

 

SGA的设置在Linux/Unix上和一个操作系统内核参数有关,这个参数是:shmmax。不同操作系统,该参数设置的位置不同,在Solaris 上,该参数由/etc/system 文件中shmsys:shminfo_shmmax定义;在Linux上,该参数由/proc/sys/kernel/shmmax参数定义

很多人将该参数理解为共享内存的大小,这是不对的。实际上shmmax内核参数定义的是系统允许的单个共享内存段的最大值,如果该参数设置小于Oracle SGA设置,那么SGA仍然可以创建成功,但是会被分配多个共享内存段。我们通常推荐通过调整shmmax设置,将SGA限制在一个共享内存段中。

 

在Windows系统中,由于系统采用多线程服务器(所有oracle server   process 实际上都是一个进程中的线程),所以不存在共享内存的问题,无需进行特殊设置。

以64位Linux平台为例来看一下shmmax参数对于数据库的影响。

 

[root@felix kernel]# uname -a

Linux felix 2.6.39-200.24.1.el6uek.x86_64 #1 SMPSat Jun 23 02:39:07 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux

[root@felix kernel]#

 

                                                                                                                                            

[root@felix kernel]# pwd

/proc/sys/kernel

[root@felix kernel]# ls shm*

shmall shmmax  shmmni

[root@felix kernel]# cat shmmax

4398046511104

[root@felix kernel]#


 

 

可以通过ipcs 命令查看此设置下共享内存的分配,我们可以看到Oracle分配了多个共享内存段以满足SGA设置的需要

[root@felix kernel]# ipcs -sa

 

------ Shared Memory Segments --------

key       shmid      owner      perms     bytes      nattch     status     

0x6c6c6536 0          root       600        4096       0                      

0x00000000 32769      gdm       600        393216     2         dest        

0x00000000 65538      gdm       600        393216     2         dest        

0x00000000 98307      gdm       600        393216     2         dest        

0x00000000 131076     gdm       600        393216     2         dest        

0x00000000 163845     gdm       600        393216     2         dest        

0x00000000 229382    oracle     640       4096       0                      

0x00000000 262151    oracle     640        4096       0                      

0xb875ccb0 294920    oracle     640        4096       0     --在此可以看出,该oracle数据库使用了3个内存段                

 

------ Semaphore Arrays --------

key       semid      owner      perms     nsems    

0x00000000 0          root       600        1        

0x00000000 32769      root      600        1        

0x549cc314 163842     oracle    640        154      

 

------ Message Queues --------

key       msqid      owner      perms     used-bytes   messages   

 

[root@felix kernel]#


通过以上输出看到为了创建OracleSGA,系 统 共 分 配 了3个共享内存段。接下来针对一个后台进程,使用pmap具查看一下每个共享内存段的地址空间

 

[root@felix kernel]# ps  -ef | grep dbw

oracle   2493     1  0 10:22 ?        00:00:00 ora_dbw0_felix

root     2688  2201  0 10:31 pts/0    00:00:00 grep dbw

[root@felix kernel]#


[root@felix kernel]# pmap  2493

2493:  ora_dbw0_felix

0000000000400000 183412K r-x--  /u01/app/oracle/product/11.2.0/db_1/bin/oracle

000000000b91d000  1884K rwx-- /u01/app/oracle/product/11.2.0/db_1/bin/oracle

000000000baf4000   304K rwx--    [ anon ]

000000000d796000   444K rwx--    [ anon ]

0000000060000000      4K r-xs- /dev/shm/ora_felix_229382_0

0000000060001000  4092K rwxs- /dev/shm/ora_felix_229382_0

0000000060400000  4096K rwxs- /dev/shm/ora_felix_229382_1

0000000060800000  4096K rwxs- /dev/shm/ora_felix_262151_0

0000000060c00000  4096K rwxs- /dev/shm/ora_felix_262151_1

0000000061000000  4096K rwxs-  /dev/shm/ora_felix_262151_2

0000000061400000  4096K rwxs- /dev/shm/ora_felix_262151_3

0000000061800000  4096K rwxs- /dev/shm/ora_felix_262151_4

0000000061c00000  4096K rwxs- /dev/shm/ora_felix_262151_5

0000000062000000  4096K rwxs-  /dev/shm/ora_felix_262151_6

0000000062400000  4096K rwxs- /dev/shm/ora_felix_262151_7

0000000062800000  4096K rwxs- /dev/shm/ora_felix_262151_8

0000000062c00000  4096K rwxs- /dev/shm/ora_felix_262151_9

0000000077400000  4096K rwxs- /dev/shm/ora_felix_262151_91

0000000077800000  4096K rwxs- /dev/shm/ora_felix_262151_92

0000000077c00000  4096K rwxs- /dev/shm/ora_felix_262151_93

0000000078000000  4096K rwxs- /dev/shm/ora_felix_262151_94

0000000078400000  4096K rwxs- /dev/shm/ora_felix_262151_95

0000000078800000  4096K rwxs- /dev/shm/ora_felix_262151_96

0000000078c00000  4096K rwxs- /dev/shm/ora_felix_262151_97

0000000079000000  4096K rwxs- /dev/shm/ora_felix_294920_0

 

注意:这里的229382、262151等就是ipcs里所看到的共享内存ID(shmid)。

 

00000030a0800000   128K r-x--  /lib64/ld-2.12.so

00000030a0a21000      4K rwx--    [ anon ]

00000030a0c00000      4K r-x-- /lib64/libaio.so.1.0.1

00000030a138c000      4K rwx-- /lib64/libc-2.12.so

00000030a138d000    20K rwx--    [ anon ]

00000030a1400000   524K r-x--  /lib64/libm-2.12.so

00000030a1a18000      4K rwx-- /lib64/libpthread-2.12.so

00000030a1a19000    16K rwx--    [ anon ]

00000030a2207000      4K rwx-- /lib64/librt-2.12.so

00000030b1800000    32K r-x--  /usr/lib64/libnuma.so.1

00000030b2000000    88K r-x--  /lib64/libnsl-2.12.so

00000030b2016000  2044K -----  /lib64/libnsl-2.12.so

00000030b2215000      4K r-x-- /lib64/libnsl-2.12.so

00000030b2216000      4K rwx-- /lib64/libnsl-2.12.so

00000030b2217000      8K rwx--    [ anon ]

00007f7f3c5d0000    64K rwx--  /dev/zero

00007f7f3c5e0000    64K rwx--  /dev/zero

00007f7f3c5f0000   144K rwx--  /dev/zero

00007f7f3c614000  7588K rwx--    [ anon ]

00007f7f3cf8a000      4K rwx-- /lib64/libnss_files-2.12.so

00007f7f3cfab000      4K rwxs- /u01/app/oracle/product/11.2.0/db_1/dbs/hc_felix.dat

00007f7f3cfac000  1296K rwx--    [ anon ]

00007f7f3d0f0000      8K r-x-- /lib64/libdl-2.12.so

00007f7f3d0f2000  2048K -----  /lib64/libdl-2.12.so

00007f7f3d2f2000      4K r-x-- /lib64/libdl-2.12.so

00007f7f3d2f3000      4K rwx-- /lib64/libdl-2.12.so

00007f7f3d2f4000      4K rwx--    [ anon ]

00007f7f3d2f5000    44K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrutl11.so

00007f7f3d300000  1024K ----- /u01/app/oracle/product/11.2.0/db_1/lib/libocrutl11.so

00007f7f3d400000      4K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrutl11.so

00007f7f3d401000   652K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrb11.so

00007f7f3d4a4000  1020K ----- /u01/app/oracle/product/11.2.0/db_1/lib/libocrb11.so

00007f7f3d5a3000      8K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libocrb11.so

00007f7f3d5a5000      4K rwx--    [ anon ]

00007f7f3d5a6000   668K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libocr11.so

00007f7f3df1c000  1020K -----  /u01/app/oracle/product/11.2.0/db_1/lib/libhasgen11.so

00007f7f3e01b000   136K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libhasgen11.so

00007f7f3e03d000    28K rwx--    [ anon ]

00007f7f3e044000   136K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libdbcfg11.so

00007f7f3e066000  1020K ----- /u01/app/oracle/product/11.2.0/db_1/lib/libdbcfg11.so

00007f7f3e609000   264K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libnnz11.so

00007f7f3e64b000   144K rwx--    [ anon ]

00007f7f3e66f000   864K r-x-- /u01/app/oracle/product/11.2.0/db_1/lib/libskgxp11.so

00007f7f3e9ab000    40K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libcell11.so

00007f7f3e9b5000      8K rwx--    [ anon ]

00007f7f3eab8000      4K rwx-- /u01/app/oracle/product/11.2.0/db_1/lib/libodmd11.so

00007f7f3eab9000      4K rwx--    [ anon ]

00007fffba5e0000   132K rwx--    [ stack ]

00007fffba7a6000      4K r-x--    [ anon ]

ffffffffff600000      4K r-x--    [ anon ]

 total           656228K


为了避免多个共享内存段,可以修改shmmax内核参数,使SGA存在于一个共享内存段中。通过修改/proc/sys/kernel/shmmax参数可以达到此目的。

 

 

以下是一个环境中的设置:

[root@danaly root]# echo 1610612736 >/proc/sys/kernel/shmmax

[root@danaly root]# more /proc/sys/kernel/shmmax

1610612736

这里修改为1.5G。对于shmmax文件的修改,系统重新启动后会复位可以通过修改/etc/sysctl.conf文件使更改永久化。在该文件内添加以下一行,这个更改在系统重新启动后生效:

kernel.shmmax =1610612736

修改shmmax之后,需要重起数据库使更改生效。

 

通常,如果没有修改shmmax参数,Oracle在启动过程中就会在告警日志文件中记录如下警告:

Starting ORACLE instance (normal)

Thu Nov 17 09:27:29 2005

WARNING: EINVAL creating segment of size 0x0000000033400000

fix shm parameters in /etc/system or equivalent

这是一个WARNING的?示,说明是建议修正,但并非强制的内容。在Solaris平台上,有时候也会看到类似的警报:

Sun Apr 30 05:35:20 2006

Starting ORACLE instance (normal)

Sun Apr 30 05:35:20 2006

WARNING: Not enough physical memory forSHM_SHARE_MMU segment of size 0x000000006d400000

[flag=0x4000]

 

这通常是因为SGA设置过大,超过了物理内存而导致的,这种情况通过修正参数即可解决。有时候这类警告也可能是因为数据库异常关闭,后台进程未正常退出,共享 内 存 未 及 时 释放引起的,对于这种情况,可以通过ipcs命令找到共享内存段id(shared memory id),然后通过ipcrm命令可以强制释放该共享内存段,完成这些特殊处理后,数据库通常就可以正常启动了。

 

 

1.4.4  9i SGA管理

 

从Oracle9i开始,Oracle 推出了动态SGA调整,也就是说,允许我们不重新启动数据库而使得SGA的修改生效

 

在Oracle9i中,我们可以设置参数SGA_MAX_SIZE,该参数用以控制各缓冲池使用的内存总和,本质上是在进程中预先分配一段虚拟地址备用而不分配物理内存,目的是防止和进程私有地址段的冲突:

 

11:00:10 sys@felix SQL>show parameter sga_max

 

NAME                                 TYPE                   VALUE

---------------------------------------------------------- ------------------------------

sga_max_size                         big integer            400M

11:00:15 sys@felix SQL>

 

 

 

11:08:02 sys@felix 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

 

38 rows selected.

 

11:08:24 sys@felix SQL>

 

其中和SGA相关的是V$DB_CACHE_ADVICE和V$SHARED_POOL_ADVICE,这些新功能通过在数据库运行时持续不断的收集信息,从而对内存的设置?供建议。

 

缓冲区高速缓存建议(buffer cacheadvisory) 受初始化参数DB_CACHE_ADVICE控制。该参数为动态参数,可用的值有三个OFF、ON 和READY。

DB_CACHE_ADVICE 不同参数值的含义分别如下:

OFF-关闭建议并且不为建议分配内存

ON-开启建议并且CPU 和内存开销都会发生

READY-关闭建议但是仍保留为建议分配的内存

 

在某些版本中,如果在参数为OFF 状态时尝试将其设置为ON 可能会出现ORA-4031错误,无法从共享池中分配内存;如果参数处于READY 状态则可以将其设置为ON 而不会发生错误,这是因为需要的内存已经分配。

 

11:08:24 sys@felix SQL>show parameterdb_cache_ad

 

NAME                                 TYPE                   VALUE

---------------------------------------------------------- ------------------------------

db_cache_advice                      string                 ON

11:13:35 sys@felix SQL>

 

 

 

我们看一下一个数据库中,Oracle收集的buffer cache建议信息:

11:13:35 sys@felix SQL>select id,

11:17:28  2         name,

11:17:28  3         block_size,

11:17:28  4         size_for_estimate         sfe,

11:17:28  5         size_factor               sf,

11:17:28  6        estd_physical_read_factor eprf,

11:17:28   7        estd_physical_reads       epr

11:17:28  8    from v$db_cache_advice;

 

 ID NAME       BLOCK_SIZE        SFE         SF       EPRF        EPR

 ------------ ---------- ---------- ---------- ---------- ----------

  3DEFAULT          8192          4     .0588     1.4798      20700

  3DEFAULT          8192          8     .1176     1.3237      18517

  3DEFAULT          8192         12     .1765     1.2074      16890

  3DEFAULT          8192         16     .2353     1.1395      15940

  3 DEFAULT          8192         20     .2941     1.1236      15717

  3DEFAULT          8192         24     .3529     1.1033      15434

  3DEFAULT          8192         28     .4118     1.0896      15242

  3DEFAULT          8192         32     .4706     1.0838      15161

  3DEFAULT          8192         36     .5294     1.0759      15050

  3DEFAULT          8192         40     .5882     1.0715      14990

  3DEFAULT          8192         44     .6471     1.0643      14889

  3DEFAULT          8192         48     .7059     1.0614      14848

  3DEFAULT          8192         52     .7647     1.0542      14747

  3DEFAULT          8192         56     .8235     1.0441      14606

  3DEFAULT          8192         60     .8824     1.0412      14565

  3 DEFAULT          8192         64     .9412     1.0094      14120

  3 DEFAULT          8192         68          1          1     13989

  3DEFAULT          8192         72    1.0588      .9964      13938

  3DEFAULT          8192         76    1.1176      .9942      13908

  3DEFAULT          8192         80    1.1765      .9877      13817

 

20 rows selected.

 

11:17:28 sys@felix SQL>


我们可以看到,伴随db_cache_size的增大,估计的物理读(estd_physical_reads)在逐渐减少,我们的选择就在于在db_cache_size的设置和physical_reads之间寻找一个边际效益最高点,使用可以接受的内存设置,获得尽量低的物理读。

 

而对于Shred  Pool的建议则受到另外一个初始化参数的影响,这个参数是: STATISTICS_LEVELSTATISTICS_LEVEL控制数据库收集的统计信息的级别,该参数有三个选项:

 

1BASIC-收集基本的统计信息

2TYPICAL-收集大部分的统计信息,这是系统的缺省设置,为了从Oracle不断增加的新特性中受益,始终应该将该参数设置为典型.

3ALL-收集全部的统计信息.

可以通过v$statistics_level视图来查看该参数的影响范围,在Oracle11g中该视图中的条目已经增加到24个:

11:35:29 sys@felix SQL>col STATISTICS_NAME fora30;

11:35:52 sys@felix SQL>select STATISTICS_NAME,

11:36:00  2         SESSION_STATUS,

11:36:00  3         SYSTEM_STATUS,

11:36:00  4         ACTIVATION_LEVEL,

11:36:00  5         SESSION_SETTABLE

11:36:00  6    from v$statistics_level;

 

STATISTICS_NAME                SESSION_STATUS   SYSTEM_STATUS    ACTIVATION_LEV SESSIO

------------------------------ -------------------------------- -------------- ------

Buffer Cache Advice            ENABLED          ENABLED          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  ENABLED          ENABLED          TYPICAL        NO

Ramp up

 

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

 

23 rows selected.



可以看到在TYPICAL设置下,Timed OS Statistics   Plan Execution Statistics  信息不收集外,其他信息都被收集。其中,  Buffer  Cache Advice   db_cache_advice 参数独立控制, Timed  Statistics   timed_statistics  参数独立控制。其他统计信息的收集都受到STATISTICS_LEVEL 参数的控制。当STATISTICS_LEVELBasic时,除受独立参数影响的Buffer Cache Advice TimedStatistics  外,其他信息收集都将被禁止。

我们可以通过查询V$SHARED_POOL_ADVICE视图获得关于Shared Pool的建议信息:


11:36:01 sys@felix SQL>selectSHARED_POOL_SIZE_FOR_ESTIMATE SPSFE,

11:47:38  2        SHARED_POOL_SIZE_FACTOR      SPSF,

11:47:38  3         ESTD_LC_SIZE,

11:47:38  4         ESTD_LC_MEMORY_OBJECTS        ELMO,

11:47:39  5         ESTD_LC_TIME_SAVED            ELTS,

11:47:39  6        ESTD_LC_TIME_SAVED_FACTOR    ELTSF,

11:47:39  7        ESTD_LC_MEMORY_OBJECT_HITS   ELMOH

11:47:39  8    from v$shared_pool_advice;

 

    SPSFE       SPSF ESTD_LC_SIZE       ELMO       ELTS     ELTSF      ELMOH

---------- ---------- ------------ -------------------- ---------- ----------

      104      .6341            8        834        814     .8781      25081

      124      .7561           28       1903        843     .9094      25874

      128      .7805           32       2109        848     .9148      25951

      132      .8049           35       2318        861     .9288      26110

      136      .8293           39      2508        867     .9353      26201

      140      .8537           42       2715        873     .9417      26293

      144       .878           46       2914        882     .9515      26404

      148      .9024           50       3162        889       .959     26515

      152      .9268           50       3221        897     .9676      26787

      156      .9512           50       3221        904     .9752      27085

      160      .9756           50       3221        916     .9881      28117

      164          1           50       3221        927          1     29153

      168     1.0244           50       3221        927          1     29157

      172     1.0488           50       3221        927          1     29157

      176     1.0732           50       3221        927          1     29157

      180     1.0976           50       3221        927          1     29157

      184      1.122           50       3221        927          1     29157

      188     1.1463           50       3221        927          1     29157

      192     1.1707           50       3221        927          1     29157

      196     1.1951           50       3221        927          1     29157

      200     1.2195           50       3221        927          1     29157

      204     1.2439           50       3221        927          1     29157

      224     1.3659           50       3221        927          1     29157

      244     1.4878           50       3221        927          1     29157

      264     1.6098           50       3221        927          1     29157

      284     1.7317           50       3221        927          1     29157

      304     1.8537           50       3221        927          1     29157

      324     1.9756           50       3221        927          1     29157

      344     2.0976           50       3221        927          1     29157

 

29 rows selected.

 

11:47:40 sys@felix SQL>


通过以上统计数据分析,当shared_pool_size设置为304M时即可达到和现在相同的效果,

目前的shared_pool_size设置浪费了部分内存,那么我们就可以动态调整shared_pool_size参数,

释放这部分内存,留给其他内存组件使用。

SQL> alter system setshared_pool_size=304M;

当进行动态参数修改时,修改Session会处于等待状态,等待事件为background parameter

adjustment

SQL> selectsid,seq#,event,SECONDS_IN_WAIT,state

2 from v$session_waitwhere sid=80;

SID  SEQ# EVENT    SECONDS_IN_WAIT STATE

---------- ------------------------------------------------------------------------80  46479  background parameter adjustment    928  WAITING

这个调整的时间可能极其漫长,从v$lock视图中,我们还可以获得相关锁定信息:

SQL> select * fromv$lock where sid=80;

ADDR KADDR SID TYPE ID1ID2 LMODE

REQUEST CTIME BLOCK

-------------------------------- ---------- ---- ---------- ---------- ------------------------------ ----------00000003CF3D6048 00000003CF3D6068 80 PE 44 0 4

0 1437 0

锁定类型为PE,即Kernel Service system Parameters ENQUEUE,在修改系统参数时需要获取该锁定。

需要提醒的是,虽然Oracle9i中,Oracle提供了动态内存修改的功能,但是仍然建议在系统规划时做好设置,尽量避免运行时的动态调整。动态调整某些系统参数(undo_retention )在繁忙的系统中可能触发bug而造成系统挂起。