ORA-04030

环境 OS AIX 5.3
DB Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
今天一开发人员提交一个错误过来,情形是这样:
在Oracle SQL developer里跑一条SQL报的:

SQL Error: ORA-04030: out of process memory when trying to allocate 2992 bytes (kxs-heap-c,temporary memory)
04030. 00000 - "out of process memory when trying to allocate %s bytes (%s,%s)"
*Cause: Operating system process private memory has been exhausted
看到Ora-04030,难道是PGA不足?难道是sort,hash等操作过多?叫开发人员发那条SQL过来,也没细看SQL,就直接在前面加上explain plan for,然后拿到SQLPLUS里跑,结果报:
Error 45 initializing SQL*Plus
Internal error
从这里来看,根本上就没有跑这条语句。看了一下那语句,真长呀,仔细分析一下那语句,整个语句比较简单,可简化成select count(1) from view where col in (...),发现in后面跟了9500多个值,这在SQL语句里应有限制的,最多只能有1000个值,一但超过这个数量,就会报:
ORA-01795: maximum number of expressions in a list is 1000。
在SQL developer也不能生成执行计划,但在SQL developer可以重现4030错误。奇怪的是,为什么不直接报ORA-1795错误,而报Ora-4030?
在metalink找到一文档5391505.8,里面描述到:
PGA memory may keep on increasing during query parsing and can reach a large
amount (sometimes even over 1G) when OR expansion occurs.
Ultimately ORA-4030 may be encountered as memory runs out.
The memory shows as "perm" space in the "kxs-heap-c" subheap.

Workaround:
alter session set "_no_or_expansion" = true
把这个参数:"_no_or_expansion"改成true后,那个带有9500多个值竟然可以跑了,然后查看其执行计划,在access中,把9500多个值放在一起,用OR连接起来。这样反推出问题的情形,Oracle把这9500多值都转化成or操作,而or操作进一步转化成union all操作,如果这样推断正确的话,这会导致这条SQL变成非常大,最终无法从PGA分配内存?而改了这个参数后,从执行计划来看,把这9500多个压缩在起了,没扩展成union all操作。

但还有一个问题不能解释的是:在in后面致多只允许1000个值的,从刚才的那条SQL来看,这限制完全突破了。在简单的测试中,即使把"_no_or_expansion"改成true,也不能超过1000.

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/45188/viewspace-1026127/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/45188/viewspace-1026127/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值