Я «думаю», что эта проблема связана с оптимизацией запросов, которую выполняет Azure Data Lake Analytics; но посмотрим...
У меня есть 2 отдельных запроса (TVF), выполняющих агрегацию, а затем окончательный запрос, чтобы объединить 2 вместе для получения окончательных результатов. Так ...
Table > Header Query
Table > Detail Query
Result = Header Query + Detail Query
Чтобы проверить всю логику, я выполняю второстепенные запросы отдельно с фильтром, сохраняя результаты в файл, а затем использую жесткие файлы в качестве источников для окончательного запроса; это общая продолжительность (минуты).
Header Query 1.4 (408 rows)
Detail Query 0.9 (3298 rows)
Final Query 0.9 (408 rows)
Так что я знаю, что максимум я могу получить свой результат примерно через 3,5 минуты. Однако я действительно не хочу создавать новые промежуточные файлы. Я хочу использовать TDF напрямую для подачи окончательного запроса.
С TDF в финальном запросе Граф заданий достигает примерно 97% прогресса примерно за 1,5 минуты. Но тут начинается ад! Последний узел представляет собой Aggregate с 2500 вершинами, что говорит о 16 минутах вычислений. Итак, мой вопрос... ПОЧЕМУ??
Является ли это тем, что я не понимаю некоторых фундаментальных концепций работы Azure?
Итак, кто-нибудь может объяснить, что происходит? Любая помощь приветствуется.
Окончательный запрос:
@Header =
SELECT [CTNNumber],
[CTNCycleNo],
[SeqStart],
[SeqEnd],
[StartUTC],
[EndUTC],
[StartLoc],
[StartType],
[EndLoc],
[EndType],
[Start Step],
[Start Ctn Status],
[Start Fill Status],
[EndStep],
[End Ctn Status],
[End Fill Status]
FROM [Play].[getCycles3]
("") AS X;
@Detail =
SELECT [CTNNumber],
[SeqNo] AS [SeqNo],
[LocationType],
[LocationID],
[BizstepDescription],
[ContainerStatus],
[FillStatus],
[UTCTimeStampforEvent]
FROM [Play].[getRaw]
("") AS Z;
@result =
SELECT
H.[CTNNumber], H.[CTNCycleNo], H.[SeqStart], H.[SeqEnd]
,COUNT([D].[SeqNo]) AS [SeqCount]
//, COUNT(DISTINCT [LocationID]) AS [#Locations]
FROM
@Header AS [H]
INNER JOIN
@Detail AS [D]
ON
[H].[CTNNumber] == [D].[CTNNumber]
WHERE
[D].[SeqNo] >= [H].[SeqStart] AND
[D].[SeqNo] <= [H].[SeqEnd]
GROUP BY
H.[CTNNumber], H.[CTNCycleNo], H.[SeqStart], H.[SeqEnd]
;