共用方式為


materialize()

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel

擷取查詢執行期間表格式表達式的值,讓查詢可以多次參考,而不需要重新計算。

語法

materialize(expression)

深入瞭解 語法慣例

參數

姓名 類型​​ 必要 描述
expression string ✔️ 查詢執行期間要評估及快取的表格式表達式。

備註

materialize() 式在下列案例中很有用:

  • 加速執行 大量 計算的查詢,其結果會在查詢中多次使用。
  • 只評估表格式表示式一次,並在查詢中使用多次。 如果表格式表達式不具決定性,這通常是必要的。 例如,如果表達式使用 rand() 或函 dcount() 式。

注意

具體化具有 5 GB 的快取大小限制。 此限制是每個叢集節點,而且是同時執行的所有查詢的相互限制。 如果查詢使用 materialize() ,且快取無法再保存任何數據,查詢將會中止併產生錯誤。

提示

執行表格式表達式具體化的另一種方式是使用 hint.materialized as 運算符和數據分割運算子的旗標。 它們全都會共用單一具體化快取。

提示

  • 推送所有可能運算符,以減少具體化數據集,並保留查詢的語意。 例如,使用相同具體化表達式頂端的一般篩選。
  • 當操作數具有可執行一次的相互子查詢時,請搭配聯結或聯集使用具體化。 例如,聯結/聯位分叉腿。 請參閱 使用聯結運算子的範例。
  • 只有在提供快取的結果名稱時,才能在 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
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 是相互的,而且可以推送至具體化表達式。 查詢只需要資料列 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 如下列查詢所示。 不過,在每個聯集腿中保留篩選條件,以保留查詢的語意。

    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))