materialize()

擷取查詢執行期間表格式表達式的值,以便查詢不重新計算即可多次參考它。

語法

materialize(expression)

深入瞭解 語法慣例

參數

名稱 類型 必要 Description
expression string ✔️ 查詢執行期間要評估和快取的表格式表達式。

備註

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

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

注意

具體化的快取大小上限是 5 GB。 此限制依每個叢集節點而定,且是所有同時執行的查詢共同的限制。 如果查詢使用 materialize(),且快取無法保存任何其他資料,則查詢將會中止,並發生錯誤。

提示

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

提示

  • 推送可減少具體化數據集的所有可能運算元,並保留查詢的語意。 例如,在相同的具體化運算式之上使用通用篩選。
  • 當聯結或聯合的運算元具有可執行一次的相互子查詢時,請搭配其使用具體化。 例如聯結/聯合叉腿。 請參閱使用聯結運算子的範例
  • 如果您提供快取的結果名稱,則具體化只能用在 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 篩選的是相互的,可以推送至具體化運算式。 查詢只需要資料行 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))