对于设置shared pool的大小来说,没有一个通用的、普遍适用的值,不同的系统负载需要不同大小的shared pool来管理。通常我们在设置shared pool时,应该遵循“不要太大、也不要太小”的原则,设置一个初始的值,然后让系统正常运行一段时间,在这段时间里,对shared pool的使用情况进行观察监控,最后根据系统的负载得出一个在当前负载下比较合理的值。注意,这里只是说明是在当前负载下,如果随着系统的不断升级,导致负载发生一个比较大的变化,这时又需要对shared pool重新监控并做出相应的调整了。
 
一般来说,设置1GB以上的shared pool不会给性能带来明显的提高,相反,这将给Oracle管理shared pool以及监控shared pool的过程中会带来较多的麻烦。我们可以在系统上线时,设置shared pool为SGA的10%,但是不要超过1GB,让系统正常运行一段时间,我们可以借助Oracle 9i以后所引入的顾问(advisory)来帮助我们判断shared pool的设置是否合理。
 
只要将初始化参数statistics_level设置为typical(默认值)或all,就能启动对shared pool的建议功能,如果设置为basic,则关闭建议功能。使用如下的SQL语句显示Oracle所建议的shared pool的大小。
 
SQL> SELECT shared_pool_size_for_estimate “SP”, estd_lc_size “EL”,
estd_lc_memory_objects “ELM”,
2  estd_lc_time_saved “ELT”, estd_lc_time_saved_factor as “ELTS”,
3  estd_lc_memory_object_hits as “ELMO”
4  FROM v$shared_pool_advice;
SP          EL                ELM              ELT            ELTS           ELMO
---------  -------        ----------     ---------      --------     ------------
128        135               12223             8566          0.9993         2980874
160        166               15809             8567          0.9994         2981291
192        197               19167             8570          0.9998         2982322
224        228               22719             8572               1         2982859
256        259               27594             8572               1         2982906
288        292               31436             8572               1         2982917
320        323               36157             8572               1         2982920
352        354               40371             8572               1         2982929
384        385               45019             8572               1         2982937
416        389               46099             8572               1         2982937
448        389               46099             8572               1         2982937
480        389               46099             8572               1         2982937
512        389               46099             8572               1         2982937
 
第一列表示Oracle所估计的shared pool的尺寸值,其他列表示在该估计的shared pool大小下所表现出来的指标值,具体含义可以参见Oracle的联机帮助。我们主要关注estd_lc_time_saved_factor列的值,当该列值为1时,表示再增加shared pool的大小对性能的提高没有意义。对于上例来说,当shared pool为224MB时,达到最佳大小。对于设置比224MB更大的shared pool来说,就是浪费空间,没有更多的好处了。
 
我们还可以借助v$shared_pool_advice来观察在不同的shared pool尺寸情况下的响应时间(单位是秒)各是多少,如下所示。
 
SQL> SELECT 'Shared Pool' component,
2         shared_pool_size_for_estimate estd_sp_size,
3         estd_lc_time_saved_factor parse_time_factor,
4         CASE
5           WHEN current_parse_time_elapsed_s + adjustment_s < 0 THEN
6            0
7           ELSE
8            current_parse_time_elapsed_s + adjustment_s
9         END response_time
10    FROM (SELECT shared_pool_size_for_estimate,
11                 shared_pool_size_factor,
12                 estd_lc_time_saved_factor,
13                 a.estd_lc_time_saved,
14                 e.VALUE / 100 current_parse_time_elapsed_s,
15                 c.estd_lc_time_saved - a.estd_lc_time_saved adjustment_s
16            FROM v$shared_pool_advice a,
17             (SELECT * FROM v$sysstat WHERE NAME = 'parse time elapsed') e,
18                 (SELECT estd_lc_time_saved
19                    FROM v$shared_pool_advice
20                   WHERE shared_pool_size_factor = 1) c);
COMPONENT   ESTD_SP_SIZE PARSE_TIME_FACTOR RESPONSE_TIME
----------- ------------ ----------------- -------------
Shared Pool          128            0.9993        252.82
Shared Pool          160            0.9994        251.82
Shared Pool          192            0.9998        248.82
Shared Pool          224                  1        246.82
Shared Pool          256                  1        246.82
Shared Pool          288                  1        246.82
Shared Pool          320                  1        246.82
Shared Pool          352                  1        246.82
Shared Pool          384                  1        246.82
Shared Pool          416                  1        246.82
Shared Pool          448                  1        246.82
Shared Pool          480                  1        246.82
Shared Pool          512                  1        246.82
 
如果是Oracle 9i之前的版本,没有顾问的话,则可以在系统运行过程中,观察shared pool的统计信息以及等待事件来判断shared pool是否合理。
 
如果设置了共享服务器(Shared Server)的连接模式,则注意要配置large pool(通过设置large_pool参数)。如果不设置large pool,session的PGA会有一部分在shared pool里进行分配,从而加重shared pool的负担。