监视具体化视图

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

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

注意

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

排查不正常的具体化视图

MaterializedViewAge如果指标不断增加,并且MaterializedViewHealth该指标显示视图不正常,请按照以下建议确定根本原因:

  • 检查群集上具体化视图的数量,以及具体化视图的当前容量:

    .show capacity 
    | where Resource == "MaterializedView"
    | project Resource, Total, Consumed
    

    输出

    资源 总计 已耗用
    MaterializedView 1 0
    • 可并发运行的具体化视图数取决于列中显示的 Total 容量,而 Consumed 列显示当前正在运行的具体化视图数。 可以使用 具体化视图容量策略 来指定最小和最大并发作数,从而替代系统的默认并发级别。 系统根据群集的可用资源确定当前并发性,如中 Total所示。 以下示例替代系统的决策,并将最小并发作从一个更改为三个:
    .alter-merge cluster policy capacity '{  "MaterializedViewsCapacity": { "ClusterMinimumConcurrentOperations": 3 } }'
    
    • 如果显式更改此策略,请监视群集的运行状况,并确保其他工作负荷不受此更改的影响。
  • 使用 .show materialized-view 失败检查具体化过程中是否存在故障。

    • 如果错误是永久性的,则系统会自动禁用具体化视图。 若要检查它是否已禁用,请使用 .show 具体化视图 命令,并查看列中的值 IsEnabled 是否为 false。 然后使用 .show journal 命令检查“日记”中禁用的事件。 永久性失败的一个示例是源表架构更改,使它与具体化视图不兼容。 有关详细信息,请参阅 .create materialized-view 命令
    • 如果故障是暂时性的,则系统会自动重试作。 但是,失败可能会延迟具体化并增加具体化视图的年龄。 例如,当达到内存限制或查询超时时,会发生这种类型的失败。有关排查暂时性故障的更多方法,请参阅以下建议。
  • 使用 .show 命令和查询 命令分析具体化过程。 替换 DatabasenameViewName 以筛选特定视图:

    .show commands-and-queries 
    | where Database  == "DatabaseName" and ClientActivityId startswith "DN.MaterializedViews;ViewName;"
    
    • 检查列中的 MemoryPeak 内存消耗,以确定因内存限制而失败的任何作,例如 ,失控查询。 默认情况下,具体化过程限制为每个节点 15 GB 内存峰值。 如果在具体化过程中执行的查询或命令超过此值,则具体化会因内存限制而失败。 若要增加每个节点的内存峰值,请更改 $materialized视图工作负荷组。 以下示例更改具体化视图工作负荷组,以在具体化期间每个节点最多使用 64-GB 内存峰值:

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

      注意

      MaxMemoryPerQueryPerNode 每个节点上可用的总内存不能超过 50%。

    • 检查具体化进程是否正在命中冷缓存。 以下示例显示具体化视图 ViewName过去一天的缓存统计信息:

      .show commands-and-queries 
      | where ClientActivityId startswith "DN.MaterializedViews;ViewName"
      | where StartedOn > ago(1d)
      | extend HotCacheHits = tolong(CacheStatistics.Shards.Hot.HitBytes), 
               HotCacheMisses = tolong(CacheStatistics.Shards.Hot.MissBytes), 
               HotCacheRetrieved = tolong(CacheStatistics.Shards.Hot.RetrieveBytes), 
               ColdCacheHits = tolong(CacheStatistics.Shards.Cold.HitBytes), 
               ColdCacheMisses = tolong(CacheStatistics.Shards.Cold.MissBytes), 
               ColdCacheRetrieved = tolong(CacheStatistics.Shards.Cold.RetrieveBytes)
      | summarize HotCacheHits = format_bytes(sum(HotCacheHits)), 
                  HotCacheMisses = format_bytes(sum(HotCacheMisses)),
                  HotCacheRetrieved = format_bytes(sum(HotCacheRetrieved)), 
                  ColdCacheHits =format_bytes(sum(ColdCacheHits)), 
                  ColdCacheMisses = format_bytes(sum(ColdCacheMisses)),
                  ColdCacheRetrieved = format_bytes(sum(ColdCacheRetrieved))
      

      输出

      HotCacheHits HotCacheMisses HotCacheRetrieved ColdCacheHits ColdCacheMisses ColdCacheRetrieved
      26 GB 0 字节 0 字节 1GB 0 字节 866 MB
    • 使用 .show 查询命令检查ScannedExtentsStatistics具体化是否正在扫描旧记录。 如果扫描盘区数较高且 MinDataScannedTime 旧,则具体化周期需要扫描视图的所有或大部分 具体化 部分。 需要扫描才能查找与 增量的交集。 有关 增量具体化 部件的详细信息,请参阅 具体化视图的工作原理。 以下建议通过最小化与 增量的交集来减少具体化周期中扫描的数据量。

  • 如果具体化周期扫描大量数据(可能包括冷缓存),请考虑对具体化视图定义进行以下更改:

    • 在视图定义中包含分组 datetime 键。 这可以显著减少扫描的数据量, 只要此列中没有延迟到达的数据。 有关详细信息,请参阅性能提示。 需要创建新的具体化视图,因为不支持对分组键的更新。
    • 用作视图定义的一 lookback 部分。 有关详细信息,请参阅 .create materialized 视图支持的属性
  • 如果具体化视图仍然不正常,则服务没有足够的容量或资源来及时具体化所有数据。 请考虑以下选项:

    • 通过增加最小实例计数来横向扩展群集。 优化的自动缩放 不会考虑具体化视图,也不会在具体化视图不正常的情况下自动横向扩展群集。 需要设置最小实例计数,以便为群集提供更多资源以适应具体化视图。
    • 将具体化视图划分为多个较小的视图,每个视图涵盖数据的子集。 例如,可以根据具体化视图分组键中的高基数键拆分它们。 所有视图都基于同一源表,每个视图都按 SourceTable | where hash(key, number_of_views) == i其筛选,其中 i 是集 {0,1,…,number_of_views-1}的一部分。 然后,可以定义一个 存储函数 ,该函数将所有较小的具体化视图联合在一 。 在查询中使用此函数访问合并的数据。

    拆分视图可能会增加 CPU 使用率,但它减少了具体化周期中的内存峰值。 如果单个视图因内存限制而失败,则减少内存峰值可能会有所帮助。

MaterializedViewResult 指标

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

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

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

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

  • SourceTableSchemaChange:源表的架构以与具体化视图定义不兼容的方式更改。 由于具体化视图查询不再与具体化视图架构匹配,因此会自动禁用具体化视图。

  • InsufficientCapacity:由于缺少 引入容量,实例没有足够的容量来具体化化视图。 虽然容量故障不足可能是暂时性的,但如果经常发生,请尝试横向扩展实例或增加策略中的相关容量。
  • InsufficientResources:数据库没有足够的资源(CPU/内存)来将具体化视图具体化。 虽然资源错误不足可能是暂时性的,但如果经常重复出现,请尝试纵向扩展或横向扩展。有关更多想法,请参阅 故障排除不正常的具体化视图

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

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

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

跟踪资源消耗情况

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

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