成就无边界服务
一个 Oracle server process 进程会消耗多少内存?
作者 新炬网络专家杨志洪
在做服务器配置规划,涉及到内存的时候,都会考虑下操作系统
自身的内存、SGA、PGA、所有连接到数据库进程消耗的内存、其他
应用进程消耗的内存。
这中间,不太好估算的是 server process 消耗内存的估算。从我
们在电信、金融这样一些相对比较大的系统使用来看,HPUX 下(11g)
每个 server process 进程大概在 10M~12M 之间,HPUX 下大概在
10M~20M 之间。有些进程如果只是连接,没有产生过任何查询或者
DML 的话,消耗的内存可能低于 5M。
也因此,一旦应用上线后,遇到内存“不够”,某些个别程序遇到
问题时,运维就会被 challenge,这些应用以前都是好好的,为什么
不行了?
有个新的例子是这样的,一个批处理的进程,消耗了 50G 内存,
居然都没有跑完。
过程代码是这样(仅更改了敏感内容):
SQL> DECLARE
2
3 TYPE TP_RRRIDTP_RRRIDTP_RRRID IS TABLE OF VARCHAR2(50) INDEX BY
BINARY_INTEGER;
4 TYPE TYPE_XC_CODE IS TABLE OF ACTUARY.TBL_TRAD.XC_CODE%TYPE INDEX
BY BINARY_INTEGER;
5 VV_RRRID TP_RRRIDTP_RRRIDTP_RRRID;
6 V_XC_CODE TYPE_XC_CODE;
7
8 BEGIN
9
10
11
12 SELECT A.ROWID,B.XC_CODE BULK COLLECT INTO VV_RRRID,V_XC_CODE
1
www.shsnc.cn
成就无边界服务
13 FROM ZBCS.TBL_UL A,
14 ZBCS.CLASSCODE_SUM B
15 WHERE A.XZCODE = B.XZCODE
16 AND A.GSCODE = ‘SHH’
17 ;
18
19 FORALL I IN VV_RRRID.FIRST..VV_RRRID.LAST
20
21 UPDATE ZBCS.TBL_UL
22 SET XC_CODE = V_XC_CODE(I)
23 WHERE ROWID = VV_RRRID(I);
24 COMMIT;
25
26 DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE,’YYYY-MM-DD HH24:MI:SS’));
27
28 END;
29 /
DECLARE
*
ERROR at line 1:
ORA-04030: out of process memory when trying to allocate 1917720 bytes (PLS
non-lib hp,DARWIN)
ORA-06512: at line 19
这个表本身虽然不算太大,半个月的时间增长近 2000 万,其中
一个分区接近一半的记录。在查询小分区的时候语句没有问题,但是
查询最大这个分区数据的时候就 ORA-04030。
当然,改进的方法不难,在 fech 的时候加以 limit 限制(5000
或者 10000 都可以)即可。
一个 oracle 连接进程到底消耗多少内存呢?当然实际的只能从
V$process 去查了。上面的通用粗糙算法大体也没有问题。
2
www.shsnc.cn