演習 - materialize 関数を使ってクエリを最適化する

完了

この演習では、materialize 関数を使ってクエリを最適化します。

materialize 関数は、クエリの他の部分が部分的な結果を参照できるように、実行時にサブクエリの結果をキャッシュすることを思い出してください。

materialize 関数を使用する

小売会社のシナリオで、あなたは営業チームから、収益上位 10 州の上位の顧客と、それらが州の売上に占める割合を求められています。

この情報を提供するため、次のように、クエリをステージに分割して各ステージで結果を表示できるようにします。

  1. 次のクエリを実行して、収益で上位の州を取得します。 let ステートメントを使って、変数 USCustomersUSCustomerSales にサブクエリを割り当てます。

    クエリを実行する

    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
    

    結果の一覧を確認します。 テーブルに StateProvinceNameUSTotalStateSales の列が含まれることに注意してください。 結果で州名を表示したいので、Customers テーブルを結果に結合する必要があります。

    Screenshot of the `materialize` function, showing the first block of the query.

  2. 次のクエリを実行して、州と、州内の上位の顧客に関する詳細を、結果に追加します。 このデータを追加するには、前のクエリの結果に 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
    

    結果は次の図のようになるはずです。

    Screenshot of the materialize function, showing the second block of the query.

  3. 次のクエリを実行して、レポートの列を出力し、上位の顧客が各自の州の売上に占める割合を計算します。

    クエリを実行する

    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)
    

    結果は次の図のようになるはずです。

    Screenshot of the materialize function, showing the entire query.