你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

materialize()

适用于:✅✅Azure 数据资源管理器Azure Monitor✅ Sentinel

捕获查询执行期间的表格表达式的值,以便查询可以多次引用它,而无需重新计算。

语法

materialize( 表达)

详细了解语法约定

参数

客户 类型​​ 必需 说明
expression string ✔️ 在执行查询期间要计算和缓存的表格表达式。

注解

materialize() 函数在以下情况下非常有用:

  • 加快那些执行大量计算(其结果在查询中多次使用)的查询的速度。
  • 只计算一次表格表达式,然后在查询中多次使用它。 如果表格表达式是不确定的,则通常是必需的。 例如,表达式使用 rand()dcount() 函数。

注意

Materialize 的缓存大小限制为 5 GB。 此限制针对每个群集节点,并且对于所有并发运行的查询都是共同的。 如果查询使用 materialize(),而缓存无法保存更多数据,则查询会中止并显示错误。

提示

执行表格表达式具体化的另一种方法是使用 hint.materializedpartition 运算符 标志。 它们都共享单个具体化缓存。

提示

  • 推送所有可能的运算符,这些运算符将减少具体化的数据集,并保留查询的语义。 例如,在同一个具体化表达式的基础上使用通用筛选器。
  • 将 materialize 与 join 或 union 一起使用(当其操作数包含可执行一次的相互的子查询时)。 例如,联接/联合分支。 请参阅使用联接运算符的示例
  • 如果为缓存结果指定了名称,则只能在 let 语句中使用 Materialize。 请参阅使用 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

输出

状态 事件类型 EventPercentage 事件
夏威夷水域 Waterspout 100 2
安大略湖 海洋雷雨风 100 8
阿拉斯加湾 Waterspout 100 4
大西洋北部 海洋雷雨风 95.2127659574468 179
伊利湖 海洋雷雨风 92.5925925925926 二十五
E PACIFIC Waterspout 90 9
密歇根湖 海洋雷雨风 85.1648351648352 155
休伦湖 海洋雷雨风 79.3650793650794 50
墨西哥湾 海洋雷雨风 71.7504332755633 414
夏威夷 高冲浪 70.0218818380744 320

以下示例将生成一组随机数字并计算:

  • 集中有多少不同的值 (Dcount)
  • 集中的前三个值
  • 集中所有这些值的总和

此操作可以使用批处理和 materialize 来完成:

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:

总和
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 上的筛选器是双向的,可推送到 materialize 表达式。 查询仅需要三列: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))