适用于:✅Azure 数据资源管理器
通过以下方式监视具体化视图的运行状况:
- 使用 Azure Monitor 在 Azure 门户中监视具体化视图指标。 使用具体化视图年龄指标
MaterializedViewAgeSeconds
作为主要指标来监视视图的新鲜度。
IsHealthy
使用.show materialized-view
. 监视属性。使用
.show materialized-view failures
检查是否失败。
注意
具体化永远不会跳过任何数据,即使存在恒定的失败。 该视图始终保证根据源表中的所有记录返回最新的查询快照。 常量失败会显著降低查询性能,但不会在视图查询中导致不正确的结果。
排查不正常的具体化视图
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 具体化视图 命令,并查看列中的值
使用 .show 命令和查询 命令分析具体化过程。 替换 Databasename 和 ViewName 以筛选特定视图:
.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 如果视图未完全位于热缓存中,具体化可能会遇到磁盘未命中,这大大减慢了进程速度。
增加具体化视图的缓存策略有助于避免缓存未命中。 有关详细信息,请参阅 热缓存和冷缓存策略以及.alter materialized-view 策略缓存命令。
使用 .show 查询命令检查
ScannedExtentsStatistics
具体化是否正在扫描旧记录。 如果扫描盘区数较高且MinDataScannedTime
旧,则具体化周期需要扫描视图的所有或大部分 具体化 部分。 需要扫描才能查找与 增量的交集。 有关 增量 和 具体化 部件的详细信息,请参阅 具体化视图的工作原理。 以下建议通过最小化与 增量的交集来减少具体化周期中扫描的数据量。
如果具体化周期扫描大量数据(可能包括冷缓存),请考虑对具体化视图定义进行以下更改:
- 在视图定义中包含分组
datetime
键。 这可以显著减少扫描的数据量, 只要此列中没有延迟到达的数据。 有关详细信息,请参阅性能提示。 需要创建新的具体化视图,因为不支持对分组键的更新。 - 用作视图定义的一
lookback
部分。 有关详细信息,请参阅 .create materialized 视图支持的属性。
- 在视图定义中包含分组
- 通过验证指标或 IngestionUtilization 指标是否显示
InsufficientCapacity
值来检查MaterializedViewResult
是否有足够的引入容量。 可以通过缩放可用资源(首选)或更改 引入容量策略来增加引入容量。
如果具体化视图仍然不正常,则服务没有足够的容量或资源来及时具体化所有数据。 请考虑以下选项:
- 通过增加最小实例计数来横向扩展群集。 优化的自动缩放 不会考虑具体化视图,也不会在具体化视图不正常的情况下自动横向扩展群集。 需要设置最小实例计数,以便为群集提供更多资源以适应具体化视图。
- 将具体化视图划分为多个较小的视图,每个视图涵盖数据的子集。 例如,可以根据具体化视图分组键中的高基数键拆分它们。 所有视图都基于同一源表,每个视图都按
SourceTable | where hash(key, number_of_views) == i
其筛选,其中i
是集{0,1,…,number_of_views-1}
的一部分。 然后,可以定义一个 存储函数 ,该函数将所有较小的具体化视图联合在一 起 。 在查询中使用此函数访问合并的数据。
拆分视图可能会增加 CPU 使用率,但它减少了具体化周期中的内存峰值。 如果单个视图因内存限制而失败,则减少内存峰值可能会有所帮助。
MaterializedViewResult 指标
该 MaterializedViewResult
指标提供有关具体化周期结果的信息,可用于识别具体化视图运行状况中的问题。 该指标包括 Database
和 MaterializedViewName
以及一个 Result
维度。
Result
维度可以具有下列值之一:
成功:具体化成功完成。
SourceTableNotFound:删除了具体化视图的源表,因此会自动禁用具体化视图。
SourceTableSchemaChange:源表的架构以与具体化视图定义不兼容的方式更改。 由于具体化视图查询不再与具体化视图架构匹配,因此会自动禁用具体化视图。
- InsufficientCapacity:由于缺少 引入容量,实例没有足够的容量来具体化化视图。 虽然容量故障不足可能是暂时性的,但如果经常发生,请尝试横向扩展实例或增加策略中的相关容量。
- InsufficientResources:数据库没有足够的资源(CPU/内存)来将具体化视图具体化。 虽然资源错误不足可能是暂时性的,但如果经常重复出现,请尝试纵向扩展或横向扩展。有关更多想法,请参阅 故障排除不正常的具体化视图。
后继数据库中的具体化视图
可以在后继数据库中定义具体化视图。 但是,对这些具体化视图的监视应基于定义具体化视图的先导数据库。 具体而言:
- 与具体化视图执行相关的指标(
MaterializedViewResult
、MaterializedViewExtentsRebuild
)仅存在于先导数据库中。 与监视(MaterializedViewAgeSeconds
、、MaterializedViewHealth
MaterializedViewRecordsInDelta
)相关的指标也出现在后续数据库中。
- .show materialized-view failures 命令仅适用于先导数据库。
跟踪资源消耗情况
具体化视图资源消耗:可以使用 .show commands-and-queries
命令跟踪具体化视图具体化过程消耗的资源。 可以使用以下命令(替换 DatabaseName
和 ViewName
)筛选特定视图的记录:
.show commands-and-queries
| where Database == "DatabaseName" and ClientActivityId startswith "DN.MaterializedViews;ViewName;"