materialize()
擷取查詢執行期間表格式表達式的值,以便查詢不重新計算即可多次參考它。
語法
materialize(
expression)
深入瞭解 語法慣例。
參數
名稱 | 類型 | 必要 | Description |
---|---|---|---|
expression | string |
✔️ | 查詢執行期間要評估和快取的表格式表達式。 |
備註
函 materialize()
式在下列案例中很有用:
- 若要加速執行 大量 計算的查詢,其結果會在查詢中多次使用。
- 只評估表格式表示式一次,並在查詢中使用多次。 如果表格式表達式不具決定性,這通常是必要的。 例如,如果表達式使用
rand()
或函dcount()
式。
注意
具體化的快取大小上限是 5 GB。 此限制依每個叢集節點而定,且是所有同時執行的查詢共同的限制。 如果查詢使用 materialize()
,且快取無法保存任何其他資料,則查詢將會中止,並發生錯誤。
提示
- 推送可減少具體化數據集的所有可能運算元,並保留查詢的語意。 例如,在相同的具體化運算式之上使用通用篩選。
- 當聯結或聯合的運算元具有可執行一次的相互子查詢時,請搭配其使用具體化。 例如聯結/聯合叉腿。 請參閱使用聯結運算子的範例。
- 如果您提供快取的結果名稱,則具體化只能用在 let 陳述式中。 請參閱使用 let 陳述式的範例。
查詢效能改進的範例
下列範例顯示如何使用 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 |
東太平洋 | 水龍捲 | 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() 的範例
提示
如果大部分查詢都會從跨數百萬個資料列的 dynamic 物件中擷取欄位,請在擷取時將您的資料行具體化。
若要使用 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))
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應