Как использовать материализованное представление Azure SQL DW в этом сценарии - PullRequest
0 голосов
/ 25 февраля 2020

У меня проблема с производительностью в одной из моих SQL хранимых процедур DW. Я пытаюсь улучшить его, используя материализованные представления.

Для начала мне дается 2 даты, например, 01 января 2005 года и 31 декабря c, 2030 года.

У меня есть таблица с именем tbl25YearHolidayList, в которой будут перечислены все праздники с 01 января 2005 года по 31 декабря * 10 017 *, 2030. В ней 3 столбца, а именно: ID, HolidayDate и Reason

У меня есть еще одна таблица с именем tbl25YearCalendar , который является календарем всех дней между 01 января 2005 года и 31 декабря * 208 года * 2030 года. В этой таблице я должен перечислить все дни, посмотреть на tbl25YearHolidayList, является ли данный день праздником, какой год, какой месяц, какой квартал, какой сегодня день и какая-то другая информация. Некоторые из столбцов, такие как идентификатор, дата, год, квартал, месяц_имя, месяц_имя, праздник (Y / N), день_имя и т. Д. c., И несколько других, связанных с финансовым годом.

В настоящее время мой код хранимой процедуры выглядит примерно так:

--Variable Declarations
DECLARE
@FIRSTDATE DATE,
@LASTDATE DATE,
@CURRENTDATE DATE,
@25YEARDAYCOUNT INT,
...

SET @FIRSTDATE = '01/01/2005'
SET @LASTDATE = '12/31/2030'
SET @CURRENTDATE = @FIRSTDATE
...
SET @25YEARDAYCOUNT = DATEDIFF(DAY,@FIRSTDATE,@LASTDATE) -- that's 9495 days!
...
-- Many more calculations and variable assignments happen here in these lines, mostly making use of 
-- CONCAT, DATEPART functions as well as CASE ... WHEN ... THEN ... ELSE blocks
...
-- Looping through the 9495 days, can't use a recursive CTE because SQL DW doesn't support it
WHILE(@25YEARDAYCOUNT > 0)
BEGIN
-- Many calculations and variable assignments here, making use of the variables assigned above 
-- CONVERT, CONCAT, DATEPART functions and CASE ... WHEN ... THEN ... ELSE blocks
-- After all column values are calculated, inserting into the table tbl25YearCalendar
INSERT INTO tbl25YearCalendar(Date, Year, Quarter, Month_Numeral, Month_Name, Day_Name, Holiday, ...)
SELECT ... calculated variables ...
...
SET @25YEARDAYCOUNT = @25YEARDAYCOUNT - 1
SET @CURRENTDATE = DATEADD(d,1,@CURRENTDATE)
END

Выполнение вышеуказанной процедуры занимает более 4 часов. Я пытаюсь получить результаты всех вычислений в материализованном представлении, а затем использовать CTAS для создания tbl25YearCalendar из материализованного представления. Но я не могу получить это правильно, так как я не пробовал это раньше. Может кто-нибудь, пожалуйста, сообщите мне, как это сделать?

Абхай

...