这篇文章是参考甲骨论老相老师的教学视频
http://v.youku.com/v_show/id_XMzk2NjAxODQ4.html?f=17419200
所做的学习笔记.
1. 什么是PGA, PGA的作用
PGA的全程是Program global area, 是Oracle数据库系统的进程(包括前台进程server process 和 后台进程各种daemon)的专用的内存空间, 每1个进程都配1个PGA, 不过实在我们说的PGA通常指的是server process的PGA.
每1个server process的PGA都只能被这个server process访问.
2. PGA的构成
1) Private SQL area
2) Session Memory #hold a session's variables (logon information) and other information related to the session
3) SQL work Areas #SQL 工作区
我们知道server process 是为连接数据库和用户客户端的session服务的, 而session的作用是什么呢? 当然是执行用户客户端提交的sql语句啊. 所以PGA结构中最重要的就是第3点 SQL 工作区, 就是为了执行sql语句服务的内存空间. 而我们主要研究的就是这个sql 工作区.
3.
SQL work Areas的构成
那么sql工作区又由那些部分构成呢?
实际上sql 工作区也可以分成几个部分, 其中主要的2部分就是:
1) sort_area #排序工作区
2) hash_area #哈希工作区
3.1 sort area
顾名思义, Sort area就是用于排序的空间.
假如,clent想从具有10000条数据的表T1中执行两条select语句:
1. select * from T1
2. select * from T1 order by c1,c2
由于这10000条数据很可能存放在多个buffer中的, 所以实际上server process不能一次过获得所有10000条数据行的,只会一条一条地获得数据行.
对于第一条语句来讲, server process中每获得一条数据行就会把这条数据行发给用户, 当中只不过会经过PGA一下, PGA在这个过程中意义不大.
而对于第一条语句来讲, PGA必须先将10000条数据排好序才能发给用户, 所以会将10000条数据缓存在PGA里的Sort Aare 里面进行排序. 最后返回给用户.
所以sort area是PGA其中1个重要的部分.
而对于sort area 有两个重要的参数.
它们是 sort_area_size , sort_area_retained_size
3.1.1 sort_area_size
顾名思义, sort_area_size 就是当前的sort area的大小了. 假如上述要排序的10000条数据总共占5MB空间,那么sort_area_size 就会扩容到5MB.
3.1.2 sort_area_retained_size
这个是sort_area的保留空间大小, 当上面的5MB 的10000条数据排好序后, server process就会把数据传给用户, 那么sort area就会释放空间, 那么释放到什么大小呢? 就是由这参数设定的啦.
3.2 Hash area
首先, Oralce数据库是1个关系数据库.
而什么是关系数据库呢? 就是表于表之间有关系啊.
绝大部分情况下, 我们不单只从1张表从取数据. 而是多表连接来去数据, 而多表连接中有一种连接是Hash连接, PGA的Hash are就是为表与表的hash连接服务的.
生产中, 大部分sql语句都会涉及排序和哈希连接, 所以这两个pga的部分十分重要...