materialize()
適用対象: ✅Microsoft Fabric✅Azure データ エクスプローラー✅Azure Monitor✅Microsoft Sentinel
再計算なしでクエリで複数回参照できるように、クエリの実行期間中の表形式式の値をキャプチャします。
materialize(
式 (expression))
構文規則について詳しく知る。
件名 | タイプ | Required | 内容 |
---|---|---|---|
式 (expression) | string |
✔️ | クエリの実行中に評価およびキャッシュされる表形式の式。 |
materialize()
関数は、次のシナリオで役立ちます。
- heavy を実行するクエリを高速化するにはクエリで結果が複数回使用される計算を実行します。
- 表形式の式を 1 回だけ評価し、クエリで何度も使用する場合。 これは一般的に、表形式の式が非決定論的な場合に必要です。 たとえば、式が
rand()
またはdcount()
関数を使用する場合です。
注意
materialize には、5 GB のキャッシュ サイズの制限があります。 この制限はクラスター ノードごとに適用され、同時に実行されるすべてのクエリに共通です。 クエリで materialize()
が使用され、キャッシュにそれ以上のデータを保持できない場合、クエリはエラーで中止されます。
ヒント
表形式式の具体化を実行するもう 1 つの方法は、as 演算子のhint.materialized
フラグとパーティション演算子を使用することです。 これらはすべて、1 つの具体化キャッシュを共有します。
ヒント
- 具体化されたデータセットを減らし、クエリのセマンティクスを保持する可能性のあるすべての演算子をプッシュします。 たとえば、同じ具体化された式の上で共通のフィルターを使用します。
- オペランドに一度実行できる相互サブクエリがある場合は、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 | Events |
---|---|---|---|
HAWAII WATERS | Waterspout | 100 | 2 |
LAKE ONTARIO | 海上雷雨風 | 100 | 8 |
GULF OF ALASKA | Waterspout | 100 | 4 |
北大西洋 | 海上雷雨風 | 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:
値 |
---|
9999998 |
9999998 |
9999997 |
結果セット 3:
SUM |
---|
15002960543563 |
ヒント
ほとんどのクエリによって、何百万行にわたる動的オブジェクトからフィールドが抽出される場合に、取り込み時に列を具体化します。
複数回使用する値を 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))