演習 - materialize 関数を使ってクエリを最適化する
この演習では、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
サブクエリを結合します。次に、USCustomerSales テーブルの
let
ステートメントでmaterialize
関数を使って、クエリを最適化します。 これにより、割り当てたサブクエリは 1 回だけ実行され、その結果はキャッシュされます。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)
結果は次の図のようになるはずです。