materialize()
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
擷取查詢執行期間表格式表達式的值,讓查詢可以多次參考,而不需要重新計算。
語法
materialize(
expression)
深入瞭解 語法慣例。
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
expression | string |
✔️ | 查詢執行期間要評估及快取的表格式表達式。 |
備註
函 materialize()
式在下列案例中很有用:
- 加速執行 大量 計算的查詢,其結果會在查詢中多次使用。
- 只評估表格式表示式一次,並在查詢中使用多次。 如果表格式表達式不具決定性,這通常是必要的。 例如,如果表達式使用
rand()
或函dcount()
式。
注意
具體化具有 5 GB 的快取大小限制。 此限制是每個叢集節點,而且是同時執行的所有查詢的相互限制。 如果查詢使用 materialize()
,且快取無法再保存任何數據,查詢將會中止併產生錯誤。
提示
查詢效能改善的範例
下列範例示範如何使用 來 materialize()
改善查詢的效能。
表達式 _detailed_data
是使用 materialize()
函式來定義,因此只會計算一次。
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 | 事件 |
---|---|---|---|
夏威夷水域 | 沃特斯普特 | 100 | 2 |
安大略湖 | 海洋雷雨風 | 100 | 8 |
阿拉斯加灣 | 沃特斯普特 | 100 | 4 |
大西洋北 | 海洋雷雨風 | 95.2127659574468 | 179 |
伊利湖 | 海洋雷雨風 | 92.5925925925926 | 25 |
E PACIFIC | 沃特斯普特 | 90 | 9 |
密歇根湖 | 海洋雷雨風 | 85.1648351648352 | 155 |
休倫湖 | 海洋雷雨風 | 79.3650793650794 | 50 |
墨西哥灣 | 海洋雷雨風 | 71.7504332755633 | 414 |
夏威夷州 | 高衝浪 | 70.0218818380744 | 320 |
下列範例會產生一組隨機數並計算:
- 集合中有多少相異值 (
Dcount
) - 集合中的前三個值
- 集合中所有這些值的總和
此作業可以使用 批次 來完成,並具體化:
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
如下列查詢所示。 不過,在每個聯集腿中保留篩選條件,以保留查詢的語意。
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))