Hi All,
Have you ever wondered what is the difference between generating records using connect by level and recursive with in CTE (available from Oracle 11R2)? I did short ora-investigation 🙂
CONNECT BY LEVEL – often used SQL method for generating values
I have executed:
SQL> select level from dual connect by level>0;
It produced an error:
ERROR: ORA-30009: Not enough memory for CONNECT BY operation
Action suggested by an Oracle for this error:
“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.”
(source: http://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm)
To it looks like Oracle keep it in PGA memory 🙂
And some part of statistics for this method:
Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 34651841 bytes sent via SQL*Net to client 1349255 bytes received via SQL*Net from client 122613 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1839180 rows processed
Generating using CTE (Common Table Expression) – on the same environment.
SQL> with z(lvl) as ( 2 select 1 lvl from dual 3 union all 4 select lvl+1 from z 5 where lvl>=1) 6 select * from z; ERROR: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP6 5094180 rows selected. Statistics ---------------------------------------------------------- 397 recursive calls 50712651 db block gets 0 consistent gets 790 physical reads 0 redo size 97765959 bytes sent via SQL*Net to client 3736255 bytes received via SQL*Net from client 339613 SQL*Net roundtrips to/from client 5094195 sorts (memory) 0 sorts (disk) 5094180 rows processed SQL>
As you can see there is a big difference between generating values using CTE and Connect by level – such as physical reads, db block gets. During this test size of temporary tablespace was increasing. No space in temporary tablespace caused an error
Summary:
It looks like that:
- Connect by level rows generating consumes memory
- Generating values by CTE consume temporary tablespace
Have a nice day!
RS