具体化视图用例

具体化视图公开对源表或另一个具体化视图的聚合查询。 本文介绍具体化视图的常见和高级用例。

常见用例

下面是可以使用具体化视图解决的常见方案:

  • 更新数据:通过使用 arg_max()(聚合函数)返回每个实体的最后一条记录来更新数据。 例如,创建一个仅对从现在开始引入的记录实施具体化的视图:

    .create materialized-view ArgMax on table T
    {
        T | summarize arg_max(Timestamp, *) by User
    }
    
  • 减少数据的解析通过对原始数据计算定期统计信息来减少数据的解析。 按时间段使用各种聚合函数。 例如,维护每天不同用户的最新快照:

    .create materialized-view UsersByDay on table T
    {
        T | summarize dcount(User) by bin(Timestamp, 1d)
    }
    
  • 重复记录:使用 take_any()(聚合函数)消除表中的重复记录。 例如,创建一个具体化视图,该视图使用 6 小时回溯时段根据 EventId 列删除源表的重复数据。 仅针对在当前记录之前的 6 小时引入的记录进行重复数据删除。

    .create materialized-view with(lookback=6h) DeduplicatedTable on table T
    {
        T
        | summarize take_any(*) by EventId
    }
    

    注意

    可以通过创建与表同名的函数来隐藏源表,该函数引用具体化视图。 此模式可确保查询表的调用方访问已删除重复数据的具体化视图,因为函数会替代同名表。 若要避免视图定义中的循环引用,请使用 table () 函数引用源表:

    .create materialized-view DeduplicatedTable on table T
    {
        table('T')
        | summarize take_any(*) by EventId
    } 
    

有关更多示例,请参阅 .create materialized-view 命令

高级方案

可以使用具体化视图来创建/更新/删除事件处理。 处理每列信息不完整或已过时的记录时,具体化视图可以为每一列提供最新更新,不包括已删除的实体。

请参考下面名为 Events 的输入表:

输入

时间戳 cud ID col1 col2 col3
2023-10-24 00:00:00.0000000 C 1 1 2
2023-10-24 01:00:00.0000000 U 1 22 33
2023-10-24 02:00:00.0000000 U 1 23
2023-10-24 00:00:00.0000000 C 2 1 2
2023-10-24 00:10:00.0000000 U 2 4
2023-10-24 02:00:00.0000000 D 2

使用 arg_max() 聚合函数创建具体化视图以获取每列的最新更新:

.create materialized-view ItemHistory on table Events
{
    Events
    | extend Timestamp_col1 = iff(isnull(col1), datetime(1970-01-01), Timestamp),
                Timestamp_col2 = iff(isnull(col2), datetime(1970-01-01), Timestamp),
                Timestamp_col3 = iff(isnull(col3), datetime(1970-01-01), Timestamp)
    | summarize arg_max(Timestamp_col1, col1), arg_max(Timestamp_col2, col2), arg_max(Timestamp_col3, col3), arg_max(Timestamp, cud) by id
}

输出

ID Timestamp_col1 col1 Timestamp_col2 col2 Timestamp_col3 col3 Timestamp cud
2 2023-10-24 00:00:00.0000000 1 2023-10-24 00:10:00.0000000 4 1970-01-01 00:00:00.0000000 2023-10-24 02:00:00.0000000 D
1 2023-10-24 00:00:00.0000000 1 2023-10-24 02:00:00.0000000 23 2023-10-24 01:00:00.0000000 33 2023-10-24 02:00:00.0000000 U

可以创建存储的函数以进一步清理结果:

ItemHistory
| project Timestamp, cud, id, col1, col2, col3
| where cud != "D"
| project-away cud

最终输出

ID 为 1 的每一列的最新更新,因为删除了 ID 2

Timestamp ID col1 col2 col3
2023-10-24 02:00:00.0000000 1 1 23 33

具体化视图与更新策略

具体化视图和更新策略的工作方式不同,适用于不同的用例。 根据以下准则来确定应使用哪一个:

  • 具体化视图适用于聚合,而更新策略则不适合。 更新策略针对每个引入批单独运行,因此只能在同一引入批中执行聚合。 如果需要聚合查询,请始终使用具体化视图。

  • 更新策略适用于数据转换、维度表的扩充(通常使用查找运算符),以及可在单个引入的范围内运行的其他数据操作。

  • 更新策略在引入期间运行。 在运行所有更新策略之前,数据不适用于源表或目标表中的查询。 另一方面,具体化视图不是引入管道的一部分。 具体化过程在引入后在后台定期运行。 源表中的记录在具体化之前可用于查询。

  • 更新策略和具体化视图都可以合并联接,但其有效性仅限于特定方案。 具体而言,只有在更新策略或具体化过程期间可以访问双方联接所需的数据时,联接才适用。 如果在更新策略或具体化运行时引入匹配实体,则存在忽略数据的风险。 有关 dimension tables 的详细信息,请参阅具体化视图查询参数事实表和维度表

注意

如果确实需要具体化联接(不适合更新策略和具体化视图),则可以使用业务流程工具协调自己的相关操作过程,并从查询命令引入