'Tune the second VT which is getting spooled out due to huge volume of data

How to tune the below second VT?

DT_RANGE-PERIOD(STRT_DT,END_DT+1)

CREATE MULTISET VOLATILE TABLE TABLE1 AS 
(
SELECT COL1, COL2,COL3
BEGIN(DT_RANGE) AS START_DT,
END(DT_RANGE) -1 AS END_DT,
row_number() over(partition by COL1, COL2,COL3 order by BEGIN(DT_RANGE) ,END(DT_RANGE) -1) as rown
FROM (
SELECT NORMALIZE ON MEETS OR OVERLAPS 
MCOL1, COL2,COL3, DT_RANGE
FROM TABLE0
)X
)WITH DATA ON COMMIT PRESERVE ROWS;

--Identify overlapping spans 
--overlp_rn - this column determines the overlapping rownumber


CREATE MULTISET VOLATILE TABLE TABLE2_COMBINED_OVERLAPS AS 
(
WITH RECURSIVE RecursiveParent( COL1, COL2,COL3,START_DT,END_DT,orig_rn, overlp_rn,query_lvl)
AS
(
SELECT   COL1, COL2,COL3,START_DT,END_DT,rown as orig_rn,0 as overlp_rn, 1 as query_lvl
FROM TABLE1 
UNION ALL 
SELECT a.COL1,a.COL2,a.COL3,a.START_DT,a.END_DT,a.orig_rn as orig_rn,b.rown as overlp_rn, 1+ a.query_lvl as query_lvl
FROM RecursiveParent a inner JOIN TABLE1 b
  on a.COL1 = b.COL1
and a.COL2 = b.COL2
and ((a.START_DT between b.START_DT and b.END_DT) or (a.END_DT between b.START_DT and b.END_DT)
or (b.START_DT between a.START_DT and a.END_DT) or (b.END_DT between a.START_DT and a.END_DT)
)
and  a.orig_rn < b.rown
where query_lvl <=  b.rown
)
SELECT distinct  COL1, COL2,COL3,START_DT,END_DT,orig_rn, max(overlp_rn) as overlp_rn
FROM RecursiveParent
group by COL1, COL2,COL3,START_DT,END_DT,orig_rn
)WITH DATA ON COMMIT PRESERVE ROWS;


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source