监视具体化视图

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

通过以下方式监视具体化视图的运行状况:

  • 在 Azure 门户中监视具体化视图指标
    • 应使用具体化视图期限指标 MaterializedViewAgeSeconds 来监视视图的新鲜度。 此指标应该是要监视的主要指标。

注意

具体化永远不会跳过任何数据,即使存在恒定的失败。 该视图始终保证根据源表中的所有记录返回最新的查询快照。 恒定的失败会显著降低查询性能,但不会导致视图查询中出现不正确的结果。

排查不正常的具体化视图

MaterializedViewHealth 指标指示具体化视图是否正常。 在具体化视图变得不正常之前,其由 MaterializedViewAgeSeconds 指标记录的时间会逐渐增加。

具体化视图可能会由于以下任一或所有原因而变得不正常:

  • 具体化过程失败。 MaterializedViewResult 指标.show materialized-view failures 命令可帮助确定失败的根本原因。
  • 由于源表的更改,系统可能已自动禁用具体化视图。 可以通过查看 .show materialized-view 命令返回的 IsEnabled 列来检查视图是否已禁用。 在具体化视图限制和已知问题中查看更多详细信息
  • 数据库没有足够的容量来按时具体化所有传入数据。 在这种情况下,可能不会出现执行失败。 但是,视图的时间会逐渐增加,因为它无法跟上引入速率。 出现这种情况可能有几个根本原因:
    • 数据库中有更多的具体化视图,并且数据库没有足够的容量来运行所有视图。 请参阅具体化视图容量策略来更改执行的具体化视图数量的默认设置。
    • 具体化速度缓慢,因为新引入的数据与大部分视图相交,并且每个具体化周期中有许多要更新的记录。 若要详细了解这为何会影响视图性能,请参阅具体化视图的工作原理

MaterializedViewResult 指标

MaterializedViewResult 指标提供有关具体化周期结果的信息,可用于标识具体化视图运行状况中的问题。 该指标包括 DatabaseMaterializedViewName 以及一个 Result 维度。

Result 维度可以具有下列值之一:

  • Success:具体化已成功完成。

  • SourceTableNotFound:具体化视图的源表已删除。 因此,将自动禁用具体化视图。

  • SourceTableSchemaChange:源表的架构发生了与具体化视图定义不兼容的更改(具体化视图查询与具体化视图架构不匹配)。 因此,将自动禁用具体化视图。

  • InsufficientCapacity:数据库没有足够的容量来将具体化视图具体化。 这可能表示缺少引入容量或缺少具体化视图容量。 容量不足故障可能是暂时性的,但如果它们经常再次发生,我们建议横向扩展数据库或增加策略中的相关容量。

  • InsufficientResources:数据库没有足够的资源(CPU/内存)来将具体化视图具体化。 此故障可能是暂时性的,但如果再次发生,请尝试纵向扩展或横向扩展数据库。

    例如,以下命令将更改具体化视图工作负荷组,使得在具体化期间每个节点最多使用 64 千兆字节 (GB) 的内存(默认值为 15 GB):

    .alter-merge workload_group ['$materialized-views'] ```
    {
      "RequestLimitsPolicy": {
        "MaxMemoryPerQueryPerNode": {
          "Value": 68719241216
        }
      }
    } ```
    

    注意

    MaxMemoryPerQueryPerNode 不能设置为每个节点的总内存的 50% 以上。

后继数据库中的具体化视图

可以在后继数据库中定义具体化视图。 但是,对这些具体化视图的监视应基于定义具体化视图的先导数据库。 具体而言:

  • 与具体化视图执行相关的指标MaterializedViewResultMaterializedViewExtentsRebuild)仅存在于先导数据库中。 与监视相关的指标(MaterializedViewAgeSecondsMaterializedViewHealthMaterializedViewRecordsInDelta)也将出现在后继数据库中。

跟踪资源消耗情况

具体化视图资源消耗:可以使用 .show commands-and-queries 命令跟踪具体化视图具体化过程消耗的资源。 可以使用以下命令(替换 DatabaseNameViewName)筛选特定视图的记录:

.show commands-and-queries 
| where Database  == "DatabaseName" and ClientActivityId startswith "DN.MaterializedViews;ViewName;"