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

具体化视图用例

适用于:✅Microsoft FabricAzure 数据资源管理器

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

常见用例

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

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

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

    .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的输入表:

输入

时间戳 反刍物 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 时间戳 反刍物
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

时间戳 ID col1 col2 col3
2023-10-24 02:00:00.0000000 1 1 23 33

具体化视图与更新策略

具体化视图和更新策略的工作方式不同,并处理不同的用例。 使用以下准则确定应使用的准则:

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

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

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

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

注意

如果需要 具体化 不适合更新策略和具体化视图的联接,可以自行管理此过程。 若要创建和存储联接操作的结果,请使用 业务流程工具 并从查询命令引入