关于PGA内存的进一步的探究(实验)

伴随自动PGA调整新特性的引入,Oracle随之引入了一系列新的视图,V$PGASTAT就是其中的一个.
在V$PGASTAT中有这样一个条目: global memory bound ,该条目记录数据库允许的最高PGA内存使用量,我们可以从不同的PGA参数设置来观察一下Oracle运行的PGA上限.

SQL> alter system set pga_aggregate_target=&Nm;
Enter value for nm: 10m
old   1: alter system set pga_aggregate_target=&Nm
new   1: alter system set pga_aggregate_target=10m
System altered.
Elapsed: 00:00:00.05
SQL> SET autotrace traceonly
SQL> SELECT DISTINCT * FROM t WHERE ROWNUM < 500000;
20000 rows selected.
Elapsed: 00:03:04.12
…….
SQL> SET autotrace off
SQL> SELECT sql_text, operation_type, POLICY, last_memory_used / 1024 / 1024,
  2         last_execution, last_tempseg_size
  3    FROM v$sql l, v$sql_workarea a
  4   WHERE l.hash_value = a.hash_value
  5     AND sql_text = 'SELECT DISTINCT * FROM t WHERE ROWNUM < 500000';
SQL_TEXT                                       OPERATION_TYPE     POLIC
-------------------------------------------------- ------------------ -----
LAST_MEMORY_USED/1024/1024 LAST_EXE LAST_TEMPSEG_SIZE
-------------------------- -------- -----------------
SELECT DISTINCT * FROM t WHERE ROWNUM < 500000     GROUP BY (SORT)    AUTO
                .548828125 206 PASSES          62914560
Elapsed: 00:00:00.02
SQL>
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                               MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                           10
global memory bound                                                   .5
SQL> alter system set pga_aggregate_target=&Nm;
Enter value for nm: 30M
old   1: alter system set pga_aggregate_target=&Nm
new   1: alter system set pga_aggregate_target=30M
System altered.
Elapsed: 00:00:00.05
SQL> SET autotrace traceonly
SQL> SELECT DISTINCT * FROM t WHERE ROWNUM < 500000;
20000 rows selected.
Elapsed: 00:00:53.30
………..
SQL> SET autotrace off
SQL> SELECT sql_text, operation_type, POLICY, last_memory_used / 1024 / 1024,
  2         last_execution, last_tempseg_size
  3    FROM v$sql l, v$sql_workarea a
  4   WHERE l.hash_value = a.hash_value
  5     AND sql_text = 'SELECT DISTINCT * FROM t WHERE ROWNUM < 500000';
SQL_TEXT                                           OPERATION_TYPE     POLIC LAST_MEMORY_USED/1024/1024
-------------------------------------------------- ------------------ ----- --------------------------
LAST_EXECUTION       LAST_TEMPSEG_SIZE
-------------------- -----------------
SELECT DISTINCT * FROM t WHERE ROWNUM < 500000     GROUP BY (SORT)    AUTO                  1.48046875
6 PASSES                      57671680

Elapsed: 00:00:00.02
SQL>
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                                MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                           30
global memory bound                                                   1.5
Elapsed: 00:00:00.00
我们可以注意到,PGA的global memory bound会一直处在5%的PGA_AGGREGATE_TARGET参数设置,直到5% PGA_AGGREGATE_TARGET超过100M,然后global memory bound被限制为100M,也就是满足我们前文提到的:
对于串行操作,单个SQL操作能够使用的PGA内存按照以下原则分配:
MIN(5% PGA_AGGREGATE_TARGET,100MB)
注意,修改PGA_AGGREGATE_TARGET参数可以使用如下命令:
alter system set pga_aggregate_target=4096M ;
修改参数后,通常需要之行操作才能看到视图信息的变化:
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                              MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                           10
global memory bound                                                    .5
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                                MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                           20
global memory bound                                                    1
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                               MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                           40
global memory bound                                                   2
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                             MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                         1024
global memory bound                                              51.1992188
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                                MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                       4096
global memory bound                                                   100

实际上这个100M的上限是受到了另外一个隐含参数的控制,该参数为_pga_max_size,该参数的缺省值为200M,单进程串行操作PGA的上限不能超过该参数的1/2.
SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
  2    FROM SYS.x$ksppi x, SYS.x$ksppcv y
  3   WHERE x.inst_id = USERENV ('Instance')
  4   AND y.inst_id = USERENV ('Instance')
  5   AND x.indx = y.indx
  6   AND x.ksppinm LIKE '%&par%'
  7  /
Enter value for par: pga_max
old   6:    AND x.ksppinm LIKE '%&par%'
new   6:    AND x.ksppinm LIKE '%pga_max%'
NAME                           VALUE      DESCRIB
---------------------------------------------  ----------------  ---
_pga_max_size                  209715200     Maximum size of the PGA memory for one process
如果我们修改该参数, global memory bound将可以突破100M的上限:
SQL> alter system set "_pga_max_size"=400M;
System altered.
……………………
SQL> SELECT NAME, VALUE / 1024 / 1024 MB
  2    FROM v$pgastat
  3   WHERE NAME IN ('aggregate PGA target parameter', 'global memory bound');
NAME                                                            MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                         4096
global memory bound                                                 200
对于PGA的控制,还有一系列的内部参数,列举如下,仅供参考:
SQL> l
  1  SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
  2    FROM SYS.x$ksppi x, SYS.x$ksppcv y
  3   WHERE x.inst_id = USERENV ('Instance')
  4     AND y.inst_id = USERENV ('Instance')
  5     AND x.indx = y.indx
  6*    AND x.ksppinm LIKE '%&par%'
SQL> /
Enter value for par: smm
old   6:    AND x.ksppinm LIKE '%&par%'
new   6:    AND x.ksppinm LIKE '%smm%'
NAME                     VALUE DESCRIB
------------------------ ----- ----------------------------------------------------------------
_smm_auto_min_io_size    56    Minimum IO size (in KB) used by sort/hash-join in auto mode
_smm_auto_max_io_size    248   Maximum IO size (in KB) used by sort/hash-join in auto mode
_smm_auto_cost_enabled   TRUE  if TRUE, use the AUTO size policy cost functions
_smm_control             0     provides controls on the memory manager
_smm_trace               0     Turn on/off tracing for SQL memory manager
_smm_min_size            128   minimum work area size in auto mode
_smm_max_size            2560  maximum work area size in auto mode (serial)
_smm_px_max_size         15360 maximum work area size in auto mode (global)
_smm_bound               0     overwrites memory manager automatically computed bound
_smm_advice_log_size     0     overwrites default size of the PGA advice workarea history log
_smm_advice_enabled      TRUE  if TRUE, enable v$pga_advice
11 rows selected.
标签: 暂无标签
oraunix

写了 199 篇文章,拥有财富 1026,被 339 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P4 | 发表于 2010-11-16 21:36:17
对于串行操作,单个SQL操作能够使用的PGA内存按照以下原则分配:
MIN(5% PGA_AGGREGATE_TARGET,100MB)

请问老师该如何理解这里的“串行”?我们的OLTP系统都是并行的,这时PGA的最大使用值还能用上面的公式吗?
回复

使用道具

P4 | 发表于 2010-11-18 14:33:02
如果一个sql是串行,最大值是MIN(5% PGA_AGGREGATE_TARGET,100MB)。
但是如果sql用了并行,则最大值要再乘以并行度N
回复

使用道具

P6 | 发表于 2010-11-18 17:13:33
串行说的是没有使用/*+ parallel(n)*/进行并行操作的session。
回复

使用道具

P4 | 发表于 2012-9-15 13:50:58
顶顶顶顶顶顶顶顶顶顶
回复

使用道具

P4 | 发表于 2012-9-27 09:43:31
收藏了!
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈