'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 |
|---|
