排查针对外部增量表的查询加速问题

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

查询 加速策略 通过缓存增量表元数据和数据文件来加速对外部增量表的查询。 该策略定义哪些日期范围(返回天数和热窗口)加速,以便对这些范围的查询可以更快地运行。

查询加速功能由以下组件组成:

  • 一个后台作业,用于维护增量表元数据的本地快照(目录)。
  • 用于缓存增量表数据文件的后台作业。
  • 利用目录和缓存数据的查询时增强功能。

若要了解为什么事情无法按预期工作,需要确定哪些组件无法正常工作。

本文可帮助你排查以下情况:

  • 对加速的外部增量表的查询将返回 过时的数据,或
  • 对加速的外部增量表的查询 速度低于预期

先决条件

  1. 运行以下命令,确保对外部表启用查询加速

    .show external table <ETName> policy query_acceleration
    | project isnotnull(Policy) and todynamic(Policy).IsEnabled
    

    如果此命令返回 false,请使用 .alter query acceleration policy 命令启用查询加速策略。

  2. 确保增量表符合 Delta 协议。

    查询加速功能假定增量表符合 Delta 协议。 不支持直接在增量表(例如编辑事务日志或 parquet 文件)上执行的手动作,并可能导致意外行为。

    如果在增量表上执行了此类作,请重新创建外部表并重新启用查询加速策略。

常见错误

查询返回过时的数据

当查询结果不反映基础增量表中的最新数据时,会出现此问题。

查询加速会定期刷新加速数据,以便结果不低于策略中配置的 MaxAge 值。 根据设计,对加速外部表的查询可能会返回滞后于最新增量表版本的数据。MaxAge 设置为 MaxAge 查询时可接受的最大数据过期时间。

可以通过两种方式控制有效 MaxAge

对加速的外部增量表的 查询速度低于 预期

如果查询的执行速度低于预期,并且查询加速似乎没有提高性能,请考虑以下潜在原因:

故障排除步骤

排查不可用的目录问题

步骤 1:检查不可用的目录

查询加速对包含增量表元数据快照的外部表使用本地目录。 如果未在配置 MaxAge 中更新此目录(请参阅查询加速策略 MaxAge 的属性),则被视为 不可用 ,并且不会在查询时使用。 在这种情况下,查询会回退到直接读取远程增量表,这可能会明显降低。

使用以下命令检索目录的当前状态:

.show external table [ETName] details
| extend MinimumUpdateTime = now() - totimespan(todynamic(QueryAccelerationPolicy).MaxAge)
| project IsCatalogUnusable = MinimumUpdateTime > todatetime(todynamic(QueryAccelerationState).LastUpdatedDateTime)

IsCatalogUnusable == true 指示目录已过时,并且不使用查询加速。

步骤 2:检查查询加速状态运行状况

若要了解目录为何不可用,请检查查询加速状态是否正常,并根据需要解决不正常的原因。

运行:

.show external table [ETName] details
| project state = todynamic(QueryAccelerationState)
| project IsHealthy = state.IsHealthy, UnhealthyReason = state.NotHealthyReason
  • 如果状态 正常 ,但目录仍然过时,可能是最近启用了查询加速策略。 首次启用查询加速策略时,需要先生成初始目录,然后才能在查询中使用它。 在此时间段内 LastUpdatedDateTime ,该值为空:

    .show external table [ETName] details
    | project todynamic(QueryAccelerationState).LastUpdatedDateTime
    

    如果 LastUpdatedDateTime 为空,请让第一次更新完成一段时间。 此过程通常需要几分钟时间。 后续更新的速度更快。

  • 如果状态 不正常,可以使用以下命令检索不正常的原因:

    .show external table [ETName] details
    | project todynamic(QueryAccelerationState).NotHealthyReason
    

使用下表来了解和缓解常见的不正常状态。

注释

若要重新启用外部表的查询加速策略,请运行以下命令:

.execute database script <|
.alter-merge external table [ETName] policy query_acceleration @'{"IsEnabled":false}'
.alter-merge external table [ETName] policy query_acceleration @'{"IsEnabled":true}'
不健康的原因 示例 NotHealthyReason Action
禁止外部表访问 InaccessibleDeltaTable: Access to Delta table is forbidden 验证外部表的连接字符串,包括身份验证方法,以及基础存储的权限是否正确。
外部表连接字符串不指向有效的增量表 DeltaTableNotFound: Delta table does not exist 更改外部表的连接字符串,使其面向有效的 Delta 表位置。 确保路径指向表的根文件夹,而不是_delta_log目录。
增量表列映射模式已更改 ColumnMappingModeChange: Column mapping mode has changed. Previous: 'None', New: 'Name' 重新创建外部表并重新启用查询加速策略。
增量表列映射已更改 NewColumnMapping: New column mapping was introduced. Column 'Col1' is now mapped to 'Col2' 重新创建外部表并重新启用查询加速策略,使列映射与增量表保持一致。
增量表列类型已更改 ColumnTypeMismatch: Column 'Col1' type has changed. Previous delta type: 'long', New type: 'string'. Respective external table type: long 重新创建(或更改)外部表,使其架构与增量表列类型保持一致,然后重新启用查询加速。
找不到热日期/时间列 HotDateTimeColumn 'Col1' does not exist as a datetime column in the Delta table schema 更改查询加速策略以包含有效的 HotDateTimeColumn (增量表中的类型 datetime 列),或根据需要将属性留空。
Delta 表具有以下不受支持的查询加速功能之一
• 列映射模式“名称”
• 使用绝对路径引用文件的 AddFile 事务
• 具有绝对路径的删除向量
Unsupported feature: Column mapping of type 'Id' 使用受支持的配置(例如,使用 Name 列映射类型)重新创建增量表,然后重新启用查询加速。
托管标识错误 Managed identity must be specified for external tables with impersonation authentication. 确保查询加速策略包含具有以下条件的有效托管标识:
• 对 Delta 表的相应权限
AutomatedFlows• 群集或数据库托管标识策略中的使用类型。

对非访问数据进行查询故障排除

步骤 3:检查查询是否超过未访问的数据

若要完全受益于查询加速,必须通过加速数据执行查询。 非加速数据直接从远程增量表读取,这可能会导致严重的延迟。 使用以下命令并筛选包含相关查询的时间范围:

.show queries
| where StartedOn > ago(1h)
| extend ExternalDataStats = OverallQueryStats.input_dataset_statistics.external_data

如果ExternalDataStats.iterated_artifacts或ExternalDataStats.downloaded_items大于 0,则表示数据是从远程增量表(非加速路径)读取的。 以下部分可帮助你了解原因。

查询可能会读取非访问数据,原因有两个主要原因:

  • 查询时间筛选器未完全在查询加速热时段或热时段内。 运行以下命令以查看热缓存属性,并确保查询筛选器匹配它们:

    .show external table [ETName] policy query_acceleration
    | project Policy = todynamic(Policy)
    | project Policy.Hot, Policy.HotWindows
    

    确保查询的时间筛选器完全包含在配置的 Hot 时间段内或定义的 HotWindows时间段内。

    如果是一次性查询,请不要更改策略。 但是,如果预计在同一时间范围内运行多个查询,该查询位于配置的 Hot 时间段之外或已定义 HotWindows ,并且需要改进性能,请通过以下方式更改策略:

    • 增加热期和/或
    • 添加与查询模式匹配的其他热窗口。
  • 策略热期中的数据未完全缓存。 使用以下命令检查加速进度:

    .show external table [ETName] details
    | project state = todynamic(QueryAccelerationState)
    | project state.CompletionPercentage, state.PendingDataFilesCount
    
    • 如果 CompletionPercentage < 100允许更多时间加速数据。
    • 如果不 CompletionPercentage 随时间推移而增加,请按照 了解和缓解数据加速问题的指南进行作。

步骤 4:了解和缓解数据加速问题

未获取的数据(CompletionPercentage < 100)可能源于多个问题。

数据当前正在加速

数据加速可能需要一些时间,尤其是在以下情况下:

  • 最近启用了查询加速策略。
  • 最近向增量表添加了大量数据。
  • 你对增量表运行 OPTIMIZE 了优化作,该作导致许多已删除和重新创建的文件。

源增量表上频繁运行 OPTIMIZEMERGE 作,导致对数据文件进行大规模重写可能会对加速性能产生负面影响,因为数据文件会反复重写,需要加速。

数据文件不符合加速条件

不会缓存大于 1 GB 的 Parquet 数据文件。

如果增量表包含许多大型文件,请考虑调整数据生成或优化策略以生成较小的 parquet 文件。 如果此调整需要重新创建 Delta 表,请确保重新创建外部表并重新启用查询加速策略。

群集容量或资源不足

查询加速作受群集的可用查询加速容量的限制。

运行以下命令以查看剩余容量:

.show capacity
| where Resource == 'QueryAcceleration'
| project Remaining
  • 如果 Remaining == 0 一致且 CompletionPercentage 未增加,请考虑:

    • 横向扩展或纵向扩展群集以提供更多资源。
    • QueryAcceleration通过更改容量策略来增加容量。

    注释

    更改容量策略可能会对其他作产生不利影响。 根据自己的自由裁量权更改策略。