У меня есть запрос, в котором я использую рекурсивный CTE. К сожалению, когда я продлеваю даты ввода, время значительно увеличивается.
Кто-нибудь сможет мне помочь, как изменить код, чтобы сделать запрос более эффективным? Кажется, проблема в CTE4.
Я удивлен медленной обработкой запроса, потому что результатом обычно является простое действие Excel. Вот так:
Производительность = x_prev * (1 + x)
DECLARE @BegOfPeriod DATE = '20100101'
,@EndOfPeriod DATE = '20191231'
,@clientID INT = 200010;
WITH
CTE AS
(
SELECT d.Date
,1+COALESCE(twr.day_diff_pct,0) as DayPct_plus1
FROM Days d
LEFT JOIN [dbo].[DailyTWR] TWR ON d.Date=twr.date AND Clientid=@clientID
WHERE d.Date between @BegOfPeriod and @EndOfPeriod AND d.Date>=(SELECT min(date) FROM DailyTWR WHERE ClientiD=@clientID)
),
CTE2 AS
(
SELECT *
,LAG(DayPct_plus1,1,1) OVER (order BY date) as DayPct_plus1_Prev
,ROW_NUMBER() OVER (order by date) as rownum
FROM cte
),
CTE3 AS
(
SELECT *
,c2.DayPct_plus1*c2.DayPct_plus1_Prev Performance
FROM CTE2 c2
),
CTE4 AS
(
SELECT c3.date,c3.DayPct_plus1,c3.DayPct_plus1_prev,c3.rownum,c3.Performance
FROM CTE3 c3
WHERE rownum=1
union all
SELECT c3.date,c3.DayPct_plus1,c3.DayPct_plus1_prev,c3.rownum
,c3.DayPct_plus1*c4.Performance as Performance
FROM CTE4 c4
JOIN CTE3 c3 ON c3.rownum=c4.rownum+1
)
SELECT c4.Date,c4.Performance
FROM CTE4 c4
option (maxrecursion 0)