Упражнение - Оптимизация запросов с использованием функции материализации
В этом упражнении вы используете функцию materialize
для оптимизации запросов.
Помните, что функция materialize
кэширует результаты вложенных запросов при выполнении, чтобы другие части запроса могли ссылаться на частичный результат.
Используйте функцию materialize
В нашем сценарии розничной компании ваша команда по продажам просит вас предоставить информацию о лучших клиентах в 10 лучших штатах, по объему выручки и о том, сколько они вносят в процентном отношении к продажам этих штатов.
Чтобы предоставить эти сведения, необходимо разбить запрос на этапы, чтобы вы могли видеть результаты на каждом этапе, как показано ниже.
Выполните следующий запрос, чтобы получить ведущие штаты по объему доходов. Используйте инструкцию
let
для назначения вложенных запросов переменнымUSCustomers
иUSCustomerSales
.let USCustomers = Customers | where RegionCountryName == 'United States'; let USCustomerSales = SalesFact | summarize USTotalCustomerSales = sum(SalesAmount) by CustomerKey | join kind=inner USCustomers on CustomerKey; USCustomerSales | summarize USTotalStateSales = round(sum(USTotalCustomerSales)) by StateProvinceName
Просмотрите полученный список. Обратите внимание, что таблица содержит столбцы для StateProvinceName и USTotalStateSales. Вы хотите отобразить название провинции в результатах, поэтому необходимо присоединить таблицу Customers к результатам.
Выполните следующий запрос, чтобы добавить провинцию и сведения о лучших клиентах в штатах в результаты. Вы добавите эти данные, присоединив вложенный запрос
USCustomerSales
к результатам предыдущего запроса.Теперь оптимизируйте запрос, используя функцию
materialize
в таблице из инструкции USCustomerSaleslet
. Это позволяет выполнить назначенный подзапрос только один раз и сохранить результаты в кэше.let USCustomers = Customers | where RegionCountryName == 'United States'; let USCustomerSales = materialize( SalesFact | summarize USTotalCustomerSales = sum(SalesAmount) by CustomerKey | join kind=inner USCustomers on CustomerKey); USCustomerSales | summarize USTotalStateSales = round(sum(USTotalCustomerSales)) by StateProvinceName | lookup ( USCustomerSales | summarize arg_max(USTotalCustomerSales, *) by StateProvinceName ) on StateProvinceName | top 10 by USTotalStateSales
Результаты должны выглядеть следующим образом:
Выполните следующий запрос, чтобы вывести столбцы отчета и вычислить вклад лучших клиентов в продажи их штата в процентах.
let Pcent = (portion: real, total: real) { round(100 * portion / total, 2) }; let USCustomers = Customers | where RegionCountryName == 'United States'; let USCustomerSales = materialize( SalesFact | summarize USTotalCustomerSales = sum(SalesAmount) by CustomerKey | join kind=inner USCustomers on CustomerKey); USCustomerSales | summarize USTotalStateSales = round(sum(USTotalCustomerSales)) by StateProvinceName | lookup ( USCustomerSales | summarize arg_max(USTotalCustomerSales, *) by StateProvinceName ) on StateProvinceName | top 10 by USTotalStateSales | project StateProvinceName, StateSales = USTotalStateSales, TopCustomerFirstName = FirstName, TopCustomerLastName = LastName, TopCustomerSales = round(USTotalCustomerSales), TopCustomerPercentage = Pcent(USTotalCustomerSales, USTotalStateSales)
Результаты должны выглядеть следующим образом: