监视具体化视图

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

注意

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

排查不正常的具体化视图

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

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

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

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 materialized-view failures 命令仅适用于先导数据库。

跟踪资源消耗情况

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

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