分析表... 计算存储指标

适用于:选中“是” Databricks Runtime 18.0 及更高版本

ANALYZE TABLE … COMPUTE STORAGE METRICS 命令计算表的总存储大小指标。 它显示了详细的存储明细,用于成本分析和优化。 有关查询性能优化,请参阅 ANALYZE TABLE ...计算统计信息

默认情况下,该命令直接扫描表的文件。 在大型表上,添加 USING INVENTORY 子句以从预生成的云存储清单报表中读取,这降低了计算存储指标的时间和成本。 请参阅 “使用清单报表”。

Syntax

ANALYZE TABLE table_name COMPUTE STORAGE METRICS
  [ USING INVENTORY LOCATION inventory_path
    CONF conf_name ]

参数

  • table_name

    标识要分析的表。 名称不得包含时态规范或选项规范或者路径。 如果找不到表,Azure Databricks 会引发 TABLE_OR_VIEW_NOT_FOUND 错误条件。

  • USING INVENTORY

    可选。 从预生成的云存储清单报表中读取存储指标,而不是扫描表的文件。 请参阅 “使用清单报表”。 采用两个子参数:

    • LOCATION inventory_path

      包含清单报表的完整云存储路径的 STRING 文本,包括任何前缀。 此路径必须与在源存储桶或容器上设置清单报表时配置的目标匹配,并且必须由你有权访问的外部位置提供支持。 请参阅 “使用清单报表”。

      例如,'abfss://your-destination-container@your-storage-account.dfs.core.chinacloudapi.cn/your-prefix/'

    • CONF conf_name

      必填。 一个 STRING 文本,用于标识要使用的源存储桶或容器上的哪些清单报表配置。

      如果使用Azure CLI配置 blob 清单策略规则,请使用为其name设置的相同值。 如果使用 Azure 控制台进行配置,请改用为规则名称设置的值。

说明

计算特定表的总存储大小指标。 此命令返回全面的存储信息,包括总字节数、活动字节数、可清空字节数、时空穿梭字节数,以及每个类别关联的文件数量。

使用此命令可识别大型表或未使用的表,优化存储成本,并了解总存储大小与活动表大小有何不同。 这对于需要跨多个表分析存储模式或跟踪一段时间内存储更改的平台管理员非常有用。

输出指标

该命令返回三列: metric_namemetric_valuemetric_description。 针对以下每个指标返回一行:

metric_name 说明
total_bytes 表的总存储大小(以字节为单位)。 这等于事务日志大小 + 活动字节 + 可清空字节 + 时间行程字节。
num_total_files 文件总数,包括增量日志文件、活动文件、可清空文件和时间旅行文件。
active_bytes sizeInBytes主动引用的数据文件的大小(以字节为单位)。
num_active_files 表主动引用的文件总数。
vacuumable_bytes 可以通过运行 VACUUM 或启用预测优化来删除的数据大小(以字节为单位)。
num_vacuumable_files 可清扫文件的数量。
time_travel_bytes 历史数据的大小(以字节为单位)用于回滚和 时间旅行 操作。 也称为墓碑字节或故障安全字节。
num_time_travel_files 用于时间旅行的文件数。

详细信息

  • 默认情况下,该命令使用递归列表方法来计算存储信息。 执行时间通常在几分钟内,但对于非常大的表,最长可能需要几个小时。
  • 此命令适用于 Unity Catalog 管理的表和外部表。
  • 该命令在运行时计算存储指标。 结果不存储在 Unity 目录中,并且不会反映在输出中 DESCRIBE EXTENDED ,输出中仅显示活动表大小。
  • 若要跟踪随时间推移的存储更改,请定期运行此命令,并将结果存储在表中。 在跨多个表的循环中运行此命令,以分析数据资产中的存储模式。 请参阅 目录中所有表的计算存储指标

使用清单报表

适用于:检查标记为“是”的 Databricks Runtime 19 及更高版本

USING INVENTORY通过读取预生成的云存储清单报表而不是扫描表的文件,使用大型表上的子句来降低计算存储指标的时间和成本。 Databricks 建议此子句用于包含 100,000 个或更多文件的表,或者对于在多个键上严重分区的表。 对于较小的表或没有配置的清单报表的表,请使用不包含此子句的命令。

USING INVENTORY 句适用于 Unity 目录托管表和外部表。 它仅在经典计算上运行。 有关更多限制,请参阅 USING INVENTORY 限制

Important

仅对指标过期是可接受的表使用清单报告。

使用此子句计算的指标反映表的最近清单报表的状态,而不是表的当前状态。 由于云提供商按计划生成清单报告,因此结果可能长达 24 小时。 结果可能与命令返回的值不同,而无需此子句。

如果最新的清单报表太过时,该命令将返回错误而不是计算指标。 请参阅 过时清单报告错误

有关命令返回的指标的信息,请参阅 输出指标

先决条件

USING INVENTORY 句具有以下先决条件:

  • 首次配置的特权:元存储管理员默认具有所需的Azure Databricks权限。 如果你不是管理员,若要设置清单报表并将其目标注册为外部位置,则必须具有以下权限:
    • 云提供商权限,用于在源存储桶或容器上配置清单报表。
    • 以下Azure Databricks将清单目标注册为外部位置的特权之一:
      • CREATE EXTERNAL LOCATION 元存储及其引用的存储凭据的特权。
      • 对外部位置的 MANAGE 权限。
  • 配置的清单报表:在保存要分析的表的每个源容器上配置Azure 存储 blob 清单报表。 使用以下设置:
    • 对象类型:Blob
    • Blob 类型:块 Blob 和追加 blob
    • 子类型:不启用 包含快照包含已删除的 Blob
    • 频率:每日
    • 导出格式:Apache Parquet
    • Blob 清单字段:包括名称上次修改、内容长度快照已删除HDI 文件夹状态(CLIschemaFieldsName、、Last-ModifiedContent-LengthSnapshotDeleted、 )。 hdi_isfolder 如果没有输出,命令将无法计算正确的输出。

Tip

Databricks 建议选择所有可用的元数据字段,以便将来获得灵活性。

Databricks 还建议在清单目标存储桶上配置 14 天的生命周期策略,以自动删除旧报表。 这可以提高命令性能并降低存储成本。 请参阅 AWS 生命周期管理Azure生命周期管理GCP 生命周期管理

  • 清单报表的外部位置:必须在清单报表的目标路径Azure Databricks中具有读取访问权限。

  • 运行命令的权限:除了对所分析表的现有特权外,还必须在READ FILESAzure Databricks中具有外部位置的权限,该位置可备份清单报表目标。

注释

云提供商最多需要 48 小时(AWS)或 24 小时(Azure,GCP)才能在初始配置后生成第一个清单报告。

若要查找表的源存储桶或容器,请运行 DESCRIBE TABLE EXTENDED 并检查 Location 输出中的字段。 对于具体化视图和流式处理表,必须使用 DESCRIBE EXTENDED 该表来查找实际的存储位置。 必须验证清单报表是否已在该源存储桶或容器上配置。

过时清单报告错误

该命令搜索过去 14 天内生成的最新完整清单报告。 如果它在该窗口中未找到任何报告,该命令不会计算指标,并返回一条 ANALYZE_TABLE_COMPUTE_STORAGE_METRICS_INVENTORY_CONTENTS_NOT_VALID 类似于以下内容的消息的错误:

No inventory reports found in the last 14 days (window: 2026-07-08 to 2026-07-22).
1 report directory(s) exist but fall outside the lookback window.
Ensure a recent inventory report has been generated.

若要解决此错误,请确认源存储桶或容器根据配置的计划生成清单报告,然后在生成新报表后再次运行该命令。 请参阅 先决条件

表类型注意事项

对于物化视图和流式处理表,total_bytes 包括表的大小和关联的元数据。 该 active_bytes 指标排除表和 vacuumable_bytestime_travel_bytes

对于浅表克隆, total_bytes 仅包括克隆自己的元数据和 Delta 日志文件,不包括源文件。 active_bytes 为零,因为克隆引用源表的数据文件。

示例

计算存储指标

若要计算存储指标,请运行以下命令:

ANALYZE TABLE main.my_schema.my_table COMPUTE STORAGE METRICS;

该命令返回输出,如下所示:

metric_name              metric_value  metric_description
----------------------- ------------  --------------------------------------------------
total_bytes                5368709120  Total bytes on disk
num_total_files                  1250  Total files on disk
active_bytes               4294967296  Bytes in current snapshot
num_active_files                 1000  Files in current snapshot
vacuumable_bytes            805306368  Bytes eligible for vacuum
num_vacuumable_files              150  Files eligible for vacuum
time_travel_bytes           268435456  Bytes reachable by time travel (excluding active)
num_time_travel_files             100  Files reachable by time travel (excluding active)

输出显示:

  • 总存储:1,250 个文件中的 5.37 GB
  • 活动数据:在 1,000 个文件中,占 4.29 GB(当前数据表版本)
  • 可清空数据:150 个文件中的 805 MB(VACUUM 可以回收此存储大小)
  • 时序数据:268 MB,分布在 100 个文件中(用于历史查询)

使用清单报表计算存储指标

以下示例从清单报表中计算相同的指标,而不是扫描表的文件:

ANALYZE TABLE main.my_schema.my_table COMPUTE STORAGE METRICS
USING INVENTORY LOCATION 'abfss://your-destination-container@your-storage-account.dfs.core.chinacloudapi.cn/your-prefix/'
CONF 'databricks-inventory-list-config';

由于清单报表反映生成报表时表的状态(最长为 24 小时),因此输出可能与直接扫描不同。 例如:

metric_name              metric_value  metric_description
----------------------- ------------  --------------------------------------------------
total_bytes                5100273664  Total bytes on disk
num_total_files                  1232  Total files on disk
active_bytes               4076863488  Bytes in current snapshot
num_active_files                  984  Files in current snapshot
vacuumable_bytes            771751936  Bytes eligible for vacuum
num_vacuumable_files              148  Files eligible for vacuum
time_travel_bytes           251658240  Bytes reachable by time travel (excluding active)
num_time_travel_files             100  Files reachable by time travel (excluding active)

请参阅 “使用清单报表”。

目录中所有表的计算存储指标

若要计算目录中每个表的存储指标,所有使用同一目标的清单报表,请使用循环。 以下示例使用 信息架构列出这些表,每个目录都会自动包括这些架构:

%python
tables = spark.sql("""
  SELECT table_catalog, table_schema, table_name
  FROM main.information_schema.tables
  WHERE table_type IN (
    'MANAGED', 'EXTERNAL',
    'STREAMING_TABLE', 'MATERIALIZED_VIEW',
    'MANAGED_SHALLOW_CLONE', 'EXTERNAL_SHALLOW_CLONE'
  )
""").collect()

for t in tables:
    full_name = f"{t.table_catalog}.{t.table_schema}.{t.table_name}"
    result = spark.sql(f"""
      ANALYZE TABLE {full_name} COMPUTE STORAGE METRICS
      USING INVENTORY LOCATION 'abfss://your-destination-container@your-storage-account.dfs.core.chinacloudapi.cn/your-prefix/'
      CONF 'databricks-inventory-list-config'
    """)
    result.show()

USING INVENTORY 限制

USING INVENTORY 句具有以下限制:

  • 此子句仅在经典计算上运行。 无服务器计算或 Databricks SQL 仓库不支持它。
  • 此子句仅支持目录表,包括托管表和外部表。 它不支持基于路径的 Delta Lake 表,该表引发错误: ANALYZE_TABLE_COMPUTE_STORAGE_METRICS_NOT_SUPPORTED错误条件
  • 如果在源存储桶或容器上启用了对象版本控制,则不能保证结果正确。
  • 如果表的存储位置发生更改,请在新的源存储桶或容器中重新配置清单报表。 原始位置不再为表生成报表。 例如,将外部表转换为托管表会更改表的存储位置。 请参阅 将外部或外来 Delta Lake 表转换为 Unity Catalog 托管表

Azure不支持跨存储帐户的清单配置。 如果表跨越多个存储帐户,每个存储帐户都需要自己的清单配置。

笔记本:计算多个表的存储指标

以下笔记本在一组 Unity 目录表中运行 ANALYZE TABLE ... COMPUTE STORAGE METRICS ... USING INVENTORY ,并将结果存储在 Delta Lake 表中。 使用它一次性分析多个表的存储。

多个表笔记本的计算存储指标

获取笔记本