ORA-30009: Not enough memory for CONNECT BY operation

Breadcrumb Abstract Shape
Breadcrumb Abstract Shape
Breadcrumb Abstract Shape
Breadcrumb Abstract Shape
Breadcrumb Abstract Shape
Breadcrumb Abstract Shape
  • User AvatarANKUSH THAVALI
  • 10 Nov, 2021
  • 0 Comments
  • 1 Min Read

ORA-30009: Not enough memory for CONNECT BY operation

ORA-30009: Not enough memory for CONNECT BY operation

Cause: The memory size was not sufficient to process all the levels of the hierarchy specified by the CONNECT BY clause.

Action: In WORKAREA_SIZE_POLICY=AUTO mode, set PGA_AGGREGATE_TARGET to a reasonably larger value. Or, in WORKAREA_SIZE_POLICY=MANUAL mode, set SORT_AREA_SIZE to a reasonably larger value.

With this post, I am sharing a very simple tip which I recently used to avoid ORA-30009. Last week one of my colleague faced ORA-30009 and when he googled following two solutions were given in most of sites:

1. Use Pipeline function using loop instead of CONNECT BY.
2. Increase PGA_AGGREGATE_TARGET, because this error came due to shortage of PGA memory.

Both of the above solutions will work, but in many cases ORA-30009 does not require any of above steps and can be fixed by breaking SQL to generate two or more sets of data and then using Cartesian product.

Let's do a quick demo:

ankush@thavali> select count(*) from dual connect by level <= 100000000;
select count(*) from dual connect by level <= 100000000
*
ERROR at line 1:
ORA-30009: Not enough memory for CONNECT BY operation

Great! we faced ORA-30009, now let's fix it :

ankush@thavali> select count(*) from
2 (select level from dual connect by level <= 10000),
3 (select level from dual connect by level <= 10000);

COUNT(*)
----------
100000000

Done!
I hope you have enjoyed this little trick on ORA-30009. Feel free to comment.