oracle之SGA/PGA简介
sga就是system global area,主要包括共享池、数据缓冲区、日志缓冲区三类。pga(program global area)和sga一样,也是开辟出来的内存区。两者的区别就是pga私有,而sga共享。pga在用户登录时候直接绑定各类会话、权限等信息,而且当排序时候也是在这个区域中进行的,但是当排序尺寸超出pga区域范围,就会占用临时表空间的大小。
sga保留了许多缓存信息,可以打打提高sql语句的运行速度,每一次sql语句执行都会在sga的share pool里面生成一条记录,当下一次执行同一条语句时候直接从share pool里面调用执行计划等,而且当查询结果在sga的数据缓冲区内的时候,可以直接避免磁盘读取(physical reads),大大提高效率。
那么,知道了pga和sga的基本信息,那么如何查看相关信息呢?
通过常规show parameter sga、show parameter pga命令可以分别查看sga和pga分配的大小。当然我们也可以通过show parameter shared_pool_size和show parameter db_cache_size来分别查看共享池和缓冲池分配大小。调整sga值大小,可以通过alter system set sga_target=1000m scope=spfile,这时候scope后面的参数也是有讲究的,当以pfile启动时候,修改sga_target只能用memory,而修改sga_max_size时候只能用spfile,这时候就必须用spfile启动了。
而sga、pga具体大小设置,一般oltp应用为内存*0.8*0.8(sga)、内存*0.8*0.2(pga);olap应用为内存*0.8*0.5(sga)、内存*0.8*0.5(pga);或者oltp sga=系统内存*70%*80% pga=sga*(10%-20%),olap sga=系统内存*80%*60%,pga=sga*(45%-65%)。
附:scope=memory代之只更改当前,重启失效
scope=spfile代之只更改以后,当前无效
scope=both更改当前和以后
缺省值:当以spfile启动时候为both,以pfile启动时候为memory
修改log_buffer和sga_max_size时只能scope=spfile