根据运行状况检查结果优化 Lakehouse 表

适用于:✅Microsoft Fabric 中的 SQL 分析端点

本教程介绍如何生成Microsoft Fabric管道来执行智能表维护。

此解决方案调用 sys.sp_get_table_health_metrics Lakehouse SQL 分析终结点上的 T-SQL 存储过程,评估结果,并且仅在表实际需要维护时才运行 OPTIMIZE 。 这种“先检查再执行”的模式可避免在状态正常的表上产生不必要的计算开销,同时确保性能下降的表能够得到自动维护。

为什么需要维护

Lakehouse 表可能会随着时间的推移累积过多的小型 Parquet 文件,这会损害 SQL 分析终结点的查询性能。

此管道不是不顾表状态按固定计划运行 OPTIMIZE,而是进行有依据的判断:先检查表的健康状况,仅在检测到异常时才触发优化。

先决条件

在开始之前,请确保具备:

解决方案结构

已完成的管道具有以下结构:

  1. 脚本活动:针对目标表执行 sp_get_table_health_metrics ,并将表运行状况指标作为结构化输出返回。
  2. 如果条件活动:直接从脚本输出读取 PotentialAnomalyType ,并检查它是否大于零。 有关 PotentialAnomalyType 的更多信息,请参阅 潜在异常类型代码
  3. 笔记本活动(在 True 分支中):在 Spark 笔记本中对该表运行 OPTIMIZE

完成本教程后,你将拥有一个可从管道流程接收参数并在被触发时优化表的笔记本。

步骤 1:创建优化笔记本

笔记本从管道接收目标 Lakehouse、架构和表名作为参数,然后使用 Spark SQL 执行 OPTIMIZE

  1. 在Fabric工作区中,选择“+ 新建项>笔记本”。
  2. 将笔记本 命名为 Optimize-Table
  3. “位置”下,选择存储你所勾选表的 Lakehouse。 本练习使用一个名为 SalesDataLakehouse 的 Lakehouse。
  4. 选择“创建”

添加参数单元格

第一个单元格定义了管道在运行时覆盖的变量。

  1. 在第一个单元格中,输入以下参数。 这些值并不重要,管道在运行时会重写它们。

    # Parameters 
    lakehouse_name = "<LakehouseName>"
    schema_name    = "<SchemaName>"
    table_name     = "<TableName>"
    

    Important

    参数化在Fabric笔记本中的工作原理:在运行时,Fabric在参数单元之后立即注入一个新单元格,该单元格使用管道传递的值重新分配这些变量。 此处设置的值仅初始化变量并提高可读性。

  2. 选择单元格菜单(...) >切换参数单元格 以将此单元格标记为参数单元格。

添加 OPTIMIZE 单元格

OPTIMIZE 命令是 Spark SQL 命令,而不是 T-SQL 命令。 必须在 Spark 环境中运行它,例如笔记本、Spark 作业定义或 Lakehouse 维护接口。 SQL 分析终结点和 Warehouse SQL 查询编辑器不支持直接此命令。

  1. 在第二个单元格中,输入:

    full_name = f"{lakehouse_name}.{schema_name}.{table_name}"
    print(f"Optimizing {full_name} ...")
    
    result = spark.sql(f"OPTIMIZE {full_name}")
    result.show(truncate=False)
    
  2. 根据需要添加 Markdown 单元格,以便为其他用户正确记录笔记本。 最终完成的笔记本应如下所示:

    标题为“当运行状况检查表明需要时优化 Lakehouse 表”的 Fabric 笔记本屏幕截图,其中包含两个 PySpark 单元格:一个用于设置由管道提供的 Lakehouse、架构和表参数,另一个用于对所选 Lakehouse 表运行 OPTIMIZE 命令。

注释

本示例以已启用架构功能的 Lakehouse 为例。 如果不使用 Lakehouse schema,请相应调整 full_name 上的三段式名称。

步骤 2:创建管道

  1. 在Fabric工作区中,选择“+ 新建项>管道”。

  2. 将该管道命名为 Check-and-Optimize-Table

  3. 选择管道画布背景,然后打开“ 参数 ”选项卡。添加三个参数:

    Name 类型 默认值
    lakehouse_name 字符串 SalesDataLakehouse
    schema_name 字符串 dbo
    table_name 字符串 FactSales

步骤 3:添加脚本活动

脚本活动 sys.sp_get_table_health_metrics 在 SQL 分析终结点上运行并捕获结果。

Important

使用 脚本 活动,而不是 存储过程 活动。 只有脚本活动将结果集公开为下游活动可以分析的结构化 JSON 输出。

  1. 在“ 活动 ”选项卡中,选择“ 脚本 ”以将其添加到画布上。
  2. 将其命名 为“检查表运行状况”。
  3. “设置” 选项卡中:
    • 连接:选择 Lakehouse 的 SQL 分析终结点。 如果未列出,请选择下拉列表底部的“ 全部浏览 ”,然后找到 Lakehouse 的 SQL 分析终结点。

    • 脚本类型:选择 查询

    • 脚本:选择 “添加动态内容 ”并输入以下表达式:

      @concat('EXEC sys.sp_get_table_health_metrics ''',
              pipeline().parameters.schema_name, '.',
              pipeline().parameters.table_name, '''')
      

此表达式生成针对目标表执行存储过程的 SQL 命令,例如: EXEC sys.sp_get_table_health_metrics 'dbo.FactSales'

验证脚本输出

运行管道一次并检查 脚本活动 输出。 你会看到一个类似于以下内容的 JSON 对象:

{
  "resultSetCount": 1,
  "resultSets": [
    {
      "rowCount": 1,
      "rows": [
        {
          "PotentialAnomalyType": 3,
          "PotentialAnomalyDescription": "Too many small files...",
          "FileCount": 2688,
          "...": "..."
        }
      ]
    }
  ]
}

Important

实际结果可能因表的状态而异。 关键在于,它返回由 sys.sp_get_table_health_metrics 公开的列。

步骤 4:添加“如果条件”活动

If Condition 活动直接从PotentialAnomalyType活动输出中读取,并根据结果做出决策。 请执行以下步骤:

  1. 在“ 活动 ”选项卡中,选择“ If 条件 ”以将活动添加到画布上。

  2. 将其命名 为“检查异常”。

  3. 绘制一条从检查表运行状况检查异常成功(绿色)箭头。

  4. If Condition 活动的“活动”选项卡中,将“表达式”设置为:

    @greater(int(activity('Check Table Health').output.resultSets[0].rows[0]['PotentialAnomalyType']), 0)
    

此表达式读取 sys.sp_get_table_health_metrics 返回的第一行,将 PotentialAnomalyType 强制转换为整数,并在该值大于零时求值为 true,这表示在目标表中检测到异常。

步骤 5:添加 Notebook 活动(True 分支)

选中If Condition活动后,选择True旁边的编辑(铅笔图标)。 画布切换为限定在 True 分支内的子画布。

  1. Notebook 活动拖到 True 子画布上。

  2. 将其命名为 “运行 OPTIMIZE”。

  3. 在“设置”选项卡中:

    • 笔记本:选择在步骤 1 中创建的 Optimize-Table 笔记本。

    • 展开 基参数,然后添加三行:

      Name 类型 价值
      lakehouse_name 字符串 @pipeline().parameters.lakehouse_name
      schema_name 字符串 @pipeline().parameters.schema_name
      table_name 字符串 @pipeline().parameters.table_name

三个名称列值必须与笔记本的参数单元格中的变量名称 完全匹配。

注释

可以将错误活动留空。 If Condition 活动将空的 False 分支视为 no-op,并将管道报告为成功。

已完成的管道应如下所示:

Fabric 数据管道的截图,其中“检查表健康状况”脚本活动连接到“检查异常”条件活动。True 分支运行 OPTIMIZE 笔记本活动,而 False 分支没有任何活动。

步骤 6:验证并运行

  1. 在管道工具栏上选择“ 验证 ”以检查配置错误。

  2. 选择 “运行 ”以手动执行管道。

  3. 监控运行情况并确认:

    1. 检查表运行状况:在运行此活动时检查此活动的输出。 您应会看到来自 sys.sp_get_table_health_metrics 存储过程的 JSON 格式输出。
    2. 检查异常:通过直接从脚本输出中读取 PotentialAnomalyType,可正确进行评估。
    3. 运行 OPTIMIZE (仅当 PotentialAnomalyType > 0): 如果 检查异常 活动评估 为 True,请查看 运行 OPTIMIZE 活动的输入以验证它是否使用正确的参数(Lakehouse 名称、架构和表名称),并检查输出以查看操作中的消息 OPTIMIZE

清理资源

如果只为本教程创建了资源,并且不再需要它们,请从工作区中删除以下项:

  • Check-and-Optimize-Table 管道。
  • Optimize-Table 笔记本。