对于设置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的负担。