sort_area_size分配机制!

[复制链接]
查看11 | 回复7 | 2005-2-28 12:57:00 | 显示全部楼层 |阅读模式
在看biti的>看到这么一个公式:
OS 使用内存+SGA+ 并发执行进程数*(sort_area_size+hash_ara_size+2M) < 0.7* 总内存,这使得我很想知道sort_area_size,hash_ara_size的分配机制:
在专用模式下,Oracle会为每个session分配sort_area_size,那么这个sort_area_size是什么时候分配的?一个session刚连接到oracle上的时候?还是这个session做排序,需要的时候?分配多大?是按需分配?还是一下子将sort_area_size分配给这个session?排序完成后sesion不退出的话,是不是不能释放?
我在自己的win2000+Oracle817做了一个简单不严谨的测试:
sort_area_size=sort_area_retained_size=4m,hash_area_size=2*sort_area_size=8M
由于sort_area_size属于pga,不知道用什么数据字典来监控这个值,只能使用win2K的任务管理中的进程来监控oracle进程占用多少内存,当一个session连接到oracle并且做排序连接的时候,oracle使用内存的数量会增加,但每次不一定增加4m,排序完成后,oracle不会下降,只有退出的时候才会释放.
能否得出这么一个结论:只有当sesion做排序连接的时候才按需分配排序所需要的内存,而且一旦分配只要该session不退出就无法回收,只能增大,最大到sort_area_size
hash_ara_size是不是做hash连接的时候按需进行分配,什么时候能进行回收呢?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
v$sesstat join v$statname (通过statistic#),查 name like '%ga%';
sort_area_size 在排序的时候分配,查询完毕释放给os,这个分配属于 PGA (虽然UGA 也在PGA 中,但不是在uga中)
查询完毕后会保留sort_area_retained_size,不过这部分放入UGA
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
谢谢biti,我又做了一个测试,两个session中设置不同的sort_area_retained_size,然后做排序,发现pga几乎相同,而uga的差值就是两个sort_area_retained_size的差值!
在专用模式下,uga是pga的一部分,pga相同是否每个session占用的内存相同?也就是调整了sort_area_retained_size每个session占用的内存也没有发生变化?另外,排序完成后,pga好像不会减少,这时候代表,查询完毕这部分内存不会释放给os?
另外,还想问一些hash_ara_size怎么进行分配的?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
会释放回os的
除了保留在 uga中的部分
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
在《8i Concepts》中有这样的描述
During a sort, Oracle may perform some tasks that do not involve referencing data
in the sort area. In such cases, Oracle may decrease the size of the sort area by
writing some of the data to a temporary segment on disk and then deallocating the
portion of the sort area that contained that data. Such deallocation may occur, for
example, if Oracle returns control to the application.
The initialization parameter SORT_AREA_RETAINED_SIZE determines the size to
which the sort area is reduced. The default value of this parameter is the value of
the SORT_AREA_SIZE parameter.
Memory released during a sort is freed for use by the same Oracle process, but it is
not released to the operating system.
为什么这里说“内存不会释放给操作系统”啊?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
使用 pga_aggregate_target可以释放回OS
8i中是只会增大
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
biti,我还想问一下公式:并发执行进程数*(sort_area_size+hash_ara_size+2M) 中的2m是大概包含什么开销?每个session一上来就分配2M?还是按照需要来动态分配的但最大只能分配2m?或者的平均值约等于2m?
回复

使用道具 举报

千问 | 2005-2-28 12:57:00 | 显示全部楼层
主要包括:
session、用户等相关信息,堆栈空间 ,private sql,cursor ....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行