materialize()

再計算なしでクエリで複数回参照できるように、クエリ実行の実行中に表形式の式の値をキャプチャします。

構文

materialize(expression)

構文規則について詳しく知る。

パラメーター

名前 必須 説明
式 (expression) string ✔️ クエリの実行中に評価およびキャッシュされる表形式式。

注釈

関数は materialize() 、次のシナリオで役立ちます。

  • クエリで結果が複数回使用される 大量 の計算を実行するクエリを高速化するため。
  • 表形式の式を 1 回だけ評価し、クエリで何度も使用する。 これは通常、表形式の式が非決定論的な場合に必要です。 たとえば、式で または 関数が rand() 使用されている場合です dcount()

Note

materialize には、5 GB のキャッシュ サイズの制限があります。 この制限はクラスター ノードごとに適用され、同時に実行されるすべてのクエリに共通です。 クエリで materialize() が使用され、キャッシュにそれ以上のデータを保持できない場合、クエリはエラーで中止されます。

ヒント

表形式式の具体化を実行するもう 1 つの方法は、hint.materializedas 演算子パーティション演算子のフラグを使用することです。 これらはすべて、単一の具体化キャッシュを共有します。

ヒント

  • 具体化されたデータセットを減らし、クエリのセマンティクスを維持するすべての可能な演算子をプッシュします。 たとえば、同じ具体化された式の上で共通のフィルターを使用します。
  • オペランドに一度実行できる相互サブクエリがある場合は、join または union で materialize を使用します。 たとえば、join/union 分岐などです。 join 演算子の使用例を参照してください。
  • materialize は、キャッシュされた結果に名前を付け、let ステートメントでのみ使用できます。 let ステートメントの使用例を参照してください。

クエリのパフォーマンス向上の例

次の例は、materialize() を使用してクエリのパフォーマンスを向上させる方法を示しています。 式 _detailed_datamaterialize() 関数を使用して定義されるため、1 回だけ計算されます。

let _detailed_data = materialize(StormEvents | summarize Events=count() by State, EventType);
_detailed_data
| summarize TotalStateEvents=sum(Events) by State
| join (_detailed_data) on State
| extend EventPercentage = Events*100.0 / TotalStateEvents
| project State, EventType, EventPercentage, Events
| top 10 by EventPercentage

出力

EventType EventPercentage イベント
HAWAII WATERS Waterspout 100 2
LAKE ONTARIO 海上雷雨風 100 8
GULF OF ALASKA Waterspout 100 4
ATLANTIC NORTH 海上雷雨風 95.2127659574468 179
LAKE ERIE 海上雷雨風 92.5925925925926 25
E PACIFIC Waterspout 90 9
LAKE MICHIGAN 海上雷雨風 85.1648351648352 155
LAKE HURON 海上雷雨風 79.3650793650794 50
GULF OF MEXICO 海上雷雨風 71.7504332755633 414
HAWAII 高波 70.0218818380744 320

次の例では、一連の乱数を生成して計算します。

  • セット内の個別の値の数 (Dcount)
  • セット内の上位 3 つの値
  • セット内のすべてのこれらの値の合計

この操作は、バッチを使用して実行し、次のように具体化できます。

let randomSet = 
    materialize(
        range x from 1 to 3000000 step 1
        | project value = rand(10000000));
randomSet | summarize Dcount=dcount(value);
randomSet | top 3 by value;
randomSet | summarize Sum=sum(value)

結果セット 1:

Dcount
2578351

結果セット 2:

value
9999998
9999998
9999997

結果セット 3:

SUM
15002960543563

materialize() の使用例

ヒント

ほとんどのクエリによって、何百万行にわたる動的オブジェクトからフィールドが抽出される場合に、取り込み時に列を具体化します。

複数回使用する値を let ステートメントと共に使用するには、materialize() 関数を使用します。 具体化されたデータセットを減らし、クエリのセマンティクスを維持する可能性のあるすべての演算子をプッシュしてみてください。 たとえば、フィルターを使用するか、必要な列のみを射影します。

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource1)), (materializedData
    | where Text !has "somestring"
    | summarize dcount(Resource2))

Text のフィルターは相互であり、具体化された式にプッシュできます。 クエリには、TimestampTextResource1Resource2 の列だけが必要です。 具体化された式内にこれらの列を射影します。

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text !has "somestring"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | summarize dcount(Resource1)), (materializedData
    | summarize dcount(Resource2))

次のクエリのように、フィルターが同一でない場合:

    let materializedData = materialize(Table
    | where Timestamp > ago(1d));
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))

結合されたフィルターによって具体化された結果が大幅に減少する場合は、次のクエリのように、具体化された結果の両方のフィルターを論理 or 式で結合します。 ただし、クエリのセマンティクスを維持するために、各 union の分岐にフィルターを保持します。

    let materializedData = materialize(Table
    | where Timestamp > ago(1d)
    | where Text has "String1" or Text has "String2"
    | project Timestamp, Resource1, Resource2, Text);
    union (materializedData
    | where Text has "String1"
    | summarize dcount(Resource1)), (materializedData
    | where Text has "String2"
    | summarize dcount(Resource2))