看oracle concepts的第八章内存管理中对于pga和sql区真的不是很好理解,就把其中的要点难点摘要下来了,
程序全局区pga是供服务进程存储数据及控制信息的内存区域。服务进程启动时由oracle创建的非共享的内存区。只有服务进程才能访问属于她的PGA,对pga的读写操作由oracle代码实现的。
PGA的内容:
每个用户都有自己的pga,记录各种不同的连接至oracle服务器的进程信息,例如用户名 密码等。登陆oracle的会话会在服务器端占用一块pga,会话刚登陆时,每个用户占用的pga大概几百KB内存,并在以后动态收缩。
私有sql区中包含绑定信息及运行时内存结构等数据。每个运行的sql语句的session都有一个私有sql区。提交相同sql语句都有自己的私有sql区,但使用同一共享sql区。同样私有sql在专用服务器模式下也存储与PGA中。
游标的私有sql区又分为:
持续数据区(绑定变量之类的数据),此区在游标关闭时释放。
运行时区,游标运行完毕后就会释放,运行时区维护会话的相关游标,例如查询时的scn,当前结果集的位置,工作区(排序 哈希 位图)也是运行时区一部分
Oracle执行用户请求例如sql查询首先需要创建游标然后打开游标,游标打开后被执行前,这一段期间所使用的内存都是使用持续数据区内存。绑定信息,sql声明等还有用来和共享sql区关联的sql地址信息。
摘自tom大师:
执行计划这些相关SQL的信息,在共享池中只留一份,各个会话的UGA中的存储指针.也就是说,在应用程序(SQL)中,应该存有相应DLL库(共享SQL)的指针,凭这个指针,将私有SQL区与共享SQL区联系起来。
私有sql区的持续数据区中存放的这个指向共享SQL区的指针,和与之对应的SQL声明文本,是持续区最重要的内容
私有sql区的持续数据区存储的绑定变量 sql声明等需要一个连接到共享sql的地址。
用户进程管理私有sql区,私有sql区的分配和回收主要取决于用户的应用程序,用户进程可分配私有sql区,私有sql区的最大数量由open_cursors控制。
专有服务器连接:私有sql区位于服务进程的pga,共享服务器:私有sql区位于sga中。
在一个语句运行游标(语句句柄被释放)被关闭后,相应的私有sql区才会被清除。
语句结束后,oracle会释放其使用的运行时区,但是此语句使用的持续数据区还是会被保留,直到关闭游标才会释放其使用的持续数据区,从而减少应用程序所占用的内存。
会话内存
用户存储会话的变量(登陆信息)和会话相关的信息。在共享服务器下,会话内存为共享而不是某个会话私有。
Sql工作区
对于复杂查询来说,运行时区的大部分容量用于需要内存的操作创建工作区之用。一般来说,更大工作区能够显著提高sql操作的性能,但是会消耗更多内存。(例如排序 分组 哈希 位图创建和融合等都会消耗pga中的sql工作区),sql工作区也是运行时区的一部分。
最好是工作区能够容纳sql语句的全部输入数据及额外的控制内存结构。不然sql语句的响应时间增加,存在部分数据数据必须放在临时磁盘区,数据数据需要在临时磁盘区与工作区间多次交换,将影响sql操作的时间。
Pga的自动管理需要设置参数workarea_size_policy=auto和pga_aggregate_target分配给pga的值。
感觉这篇blog很乱,有些知识点自己真是没有弄清楚,以前看pga内存看见了就逃避,慢慢地还是有了点自己的理解。
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1055838/ ,如需转载,请注明出处,否则将追究法律责任。