Exercice : Optimiser les requêtes en utilisant la fonction materialize
Dans cet exercice, vous utilisez la fonction materialize
pour optimiser vos requêtes.
Pour rappel, la fonction materialize
met en cache les résultats d’une sous-requête pendant l’exécution afin que d’autres parties de la requête puissent référencer le résultat partiel.
Utiliser la fonction materialize
Dans notre scénario d'entreprise de vente au détail, votre équipe de vente vous demande quels sont les meilleurs clients dans les 10 principaux États, en termes de chiffre d'affaires et de leur contribution, en pourcentage, aux ventes des états.
Pour fournir ces informations, vous devez décomposer la requête en plusieurs étapes afin de pouvoir consulter les résultats à chaque étape, de la manière suivante :
Exécutez la requête suivante pour obtenir les états qui rapportent le meilleur chiffre d’affaires. Utilisez l’instruction
let
pour attribuer des sous-requêtes aux variablesUSCustomers
etUSCustomerSales
.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
Examinez la liste résultante. Notez que la table contient des colonnes de StateProvinceName et USTotalStateSales. Vous souhaitez afficher le nom de la province dans les résultats, vous devez donc joindre la table Clients aux résultats.
Exécutez la requête suivante pour ajouter la province et les détails à propos des meilleurs clients dans les états aux résultats. Ajoutez ces données en joignant la sous-requête
USCustomerSales
aux résultats de la requête précédente.Optimisez maintenant la requête en utilisant la fonction
materialize
dans l’instructionlet
de table USCustomerSales. Cela permet d’exécuter la sous-requête affectée une seule fois et de mettre en cache les résultats.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
Les résultats doivent ressembler à ceux de l’image suivante :
Exécutez la requête suivante pour générer les colonnes du rapport et calculer le pourcentage que représentent les principaux clients dans les ventes à leur État.
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)
Les résultats doivent ressembler à ceux de l’image suivante :