materialize()
再計算なしでクエリで複数回参照できるように、クエリ実行の実行中に表形式の式の値をキャプチャします。
構文
materialize(
expression)
構文規則について詳しく知る。
パラメーター
名前 | 型 | 必須 | 説明 |
---|---|---|---|
式 (expression) | string |
✔️ | クエリの実行中に評価およびキャッシュされる表形式式。 |
注釈
関数は materialize()
、次のシナリオで役立ちます。
- クエリで結果が複数回使用される 大量 の計算を実行するクエリを高速化するため。
- 表形式の式を 1 回だけ評価し、クエリで何度も使用する。 これは通常、表形式の式が非決定論的な場合に必要です。 たとえば、式で または 関数が
rand()
使用されている場合ですdcount()
。
Note
materialize には、5 GB のキャッシュ サイズの制限があります。 この制限はクラスター ノードごとに適用され、同時に実行されるすべてのクエリに共通です。 クエリで materialize()
が使用され、キャッシュにそれ以上のデータを保持できない場合、クエリはエラーで中止されます。
ヒント
表形式式の具体化を実行するもう 1 つの方法は、hint.materialized
as 演算子とパーティション演算子のフラグを使用することです。 これらはすべて、単一の具体化キャッシュを共有します。
ヒント
- 具体化されたデータセットを減らし、クエリのセマンティクスを維持するすべての可能な演算子をプッシュします。 たとえば、同じ具体化された式の上で共通のフィルターを使用します。
- オペランドに一度実行できる相互サブクエリがある場合は、join または union で materialize を使用します。 たとえば、join/union 分岐などです。 join 演算子の使用例を参照してください。
- materialize は、キャッシュされた結果に名前を付け、let ステートメントでのみ使用できます。 let ステートメントの使用例を参照してください。
クエリのパフォーマンス向上の例
次の例は、materialize()
を使用してクエリのパフォーマンスを向上させる方法を示しています。
式 _detailed_data
は materialize()
関数を使用して定義されるため、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
のフィルターは相互であり、具体化された式にプッシュできます。
クエリには、Timestamp
、Text
、Resource1
、Resource2
の列だけが必要です。 具体化された式内にこれらの列を射影します。
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))
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示