pga_aggregate_target与workarea_size_policy相互关系验证
先放上结论:
1. 当pga_aggregate_target设置为非0, 手工设置(workarea _size_policy设置为manual),这时使用的 manual管理模式,而不是auto管理模式
2. 当内存为自动管理时(2个条件同时满足,pga_aggregate_target设置为非0,workarea _size_policy设置为auto),sort_area_size不生效;当内存为手动管理时(1个条件,workarea _size_policy设置为manual,不管pga_aggregate_target是什么值),sort_area_size生效。
问题:
今日,从网上看到一篇总结pga方面参数配置的文章,其中提到<2>点,workarea _size_policy设置为manual,pga_aggregate_target设置为非0,会使用自动内存管理。
我对于其中的第二点持怀疑态度,遂做一个测试。
单个session的PGA内存使用量限制有比较多的概念,现在统一梳理一下:
1、关于PGA内存是自动管理还是手工管理,以及*_area_size(例如 sort_area_size)参数是否生效
workarea_size_policy:该参数定义数据库PGA内存是否自动管理,同时涉及到SQL运行中各种内存参数设置是否生效;当PGA内存为自动内存管理(workarea_size_policy =auto),有关SQL运行的各种内存参数设置(例如sort_area_size 排序内存大小)均不生效,但至于SQL运行的各种内存参数设置生否真的生效,还与pga_aggregate_target值有关,具体如下:
(1)workarea _size_policy设置为auto,pga_aggregate_target设置为0 ,不会使用自动内存管理,因为当pga_aggregate_target设置为0时,workarea _size_policy自动设置为manual。
(2)workarea _size_policy设置为manual,pga_aggregate_target设置为非0,会使用自动内存管理。因为,如果设置pga_aggregate_targe为非0,workarea _size_policy自动设置为auto,因此,使用自动管理。
-- 经过自己的测试,这个说法是不正确的,当pga_aggregate_target设置为非0, 手工设置(workarea _size_policy设置为manual),这时使用的 manual管理模式,而不是auto管理模式
(3)如果不设置pga_aggregate_targe,那么系统缺省也是使用自动管理,并且设置该参数的值为SGA的20%和10M中较大的值。
总之:当内存为自动管理时(2个条件同时满足,pga_aggregate_target设置为非0,workarea _size_policy设置为auto),sort_area_size不生效;当内存为手动管理时(1个条件,workarea _size_policy设置为manual,不管pga_aggregate_target是什么值),sort_area_size生效。
测试:
主要通过看v$pgastat 的 如下4个指标来观察到底用了什么方式的pga管理,到底是 manual还是 auto
total PGA used for auto workareas maximum PGA used for auto workareas total PGA used for manual workareas maximum PGA used for manual workareas
1.首先禁用AMM
memory_max_target big integer 0memory_target big integer 0
2. 系统目前状态, pga_aggregate_target=224M , workarea_size_policy= AUTO
3. 手动设置 workarea_size_policy= manual
注释: 在设置为manual之后,测试了一下重新将 pga_aggregate_target设置为另外一个值,这时并不会将workarea_size_policy自动设置为auto,看来官网上说的是从0设置为其他值时,才会将policy自动改为auto
4. 重启实例,可以看到这4个相关指标都是0
5.创建测试表
SQL> create table x as select * from dba_objects;Table created.SQL> insert into x select * from x;86672 rows created.SQL> insert into x select * from x;173344 rows created.SQL> commit;Commit complete.
6. 执行一个较大的排序查询,select * from x order by OBJECT_ID,LAST_DDL_TIME;
7.再次观察 v$pgastat ,
可以看出 manual的2个相关指标有变化了,而 auto都是0,这里说明了 真实采用的是 manual方式。
8.改回 auto再试试
9.执行sql前
total PGA used for auto workareas 0 bytesmaximum PGA used for auto workareas 0 bytestotal PGA used for manual workareas 67584 bytesmaximum PGA used for manual workareas 274432 bytes
10.执行sql select * from x order by OBJECT_ID,LAST_DDL_TIME;
11. 再次观察,发现auto指标变化了, 而 manual毫无变化
total PGA used for auto workareas 429056 bytesmaximum PGA used for auto workareas 7204864 bytestotal PGA used for manual workareas 67584 bytesmaximum PGA used for manual workareas 274432 bytes
12, 经过几次反复的验证,证明了 pga是采用auto模式还是manual模式,是由参数 workarea_size_policy控制的,而跟 pga_aggrate_target没关系。
结论:
(2)workarea _size_policy设置为manual,pga_aggregate_target设置为非0,会使用自动内存管理。 因为,如果设置pga_aggregate_targe为非0,workarea _size_policy自动设置为auto,因此,使用自动管理。-- 经过自己的测试,这个说法是不正确的,当pga_aggregate_target设置为非0, 手工设置(workarea _size_policy设置为manual),这时使用的 manual管理模式,而不是auto管理模式
总之:当内存为自动管理时(2个条件同时满足,pga_aggregate_target设置为非0,workarea _size_policy设置为auto),sort_area_size不生效;
当内存为手动管理时(1个条件,workarea _size_policy设置为manual,不管pga_aggregate_target是什么值),sort_area_size生效。