适用于:✅Microsoft Fabric 中的 SQL 分析端点
本教程介绍如何生成Microsoft Fabric管道来执行智能表维护。
此解决方案调用 sys.sp_get_table_health_metrics Lakehouse SQL 分析终结点上的 T-SQL 存储过程,评估结果,并且仅在表实际需要维护时才运行 OPTIMIZE 。 这种“先检查再执行”的模式可避免在状态正常的表上产生不必要的计算开销,同时确保性能下降的表能够得到自动维护。
为什么需要维护
Lakehouse 表可能会随着时间的推移累积过多的小型 Parquet 文件,这会损害 SQL 分析终结点的查询性能。
此管道不是不顾表状态按固定计划运行 OPTIMIZE,而是进行有依据的判断:先检查表的健康状况,仅在检测到异常时才触发优化。
先决条件
在开始之前,请确保具备:
- 具有参与者或更高权限的 Microsoft Fabric 工作区。
- 该工作区中包含至少一个要监视的 Delta 表的 Lakehouse。 本教程使用名为
SalesDataLakehouse的湖仓。 - 熟悉Fabric 数据管道。
- 熟悉Fabric 笔记本。
解决方案结构
已完成的管道具有以下结构:
-
脚本活动:针对目标表执行
sp_get_table_health_metrics,并将表运行状况指标作为结构化输出返回。 -
如果条件活动:直接从脚本输出读取
PotentialAnomalyType,并检查它是否大于零。 有关PotentialAnomalyType的更多信息,请参阅 潜在异常类型代码。 -
笔记本活动(在 True 分支中):在 Spark 笔记本中对该表运行
OPTIMIZE。
完成本教程后,你将拥有一个可从管道流程接收参数并在被触发时优化表的笔记本。
步骤 1:创建优化笔记本
笔记本从管道接收目标 Lakehouse、架构和表名作为参数,然后使用 Spark SQL 执行 OPTIMIZE。
- 在Fabric工作区中,选择“+ 新建项>笔记本”。
- 将笔记本 命名为 Optimize-Table。
- 在 “位置”下,选择存储你所勾选表的 Lakehouse。 本练习使用一个名为
SalesDataLakehouse的 Lakehouse。 - 选择“创建”。
添加参数单元格
第一个单元格定义了管道在运行时覆盖的变量。
在第一个单元格中,输入以下参数。 这些值并不重要,管道在运行时会重写它们。
# Parameters lakehouse_name = "<LakehouseName>" schema_name = "<SchemaName>" table_name = "<TableName>"Important
参数化在Fabric笔记本中的工作原理:在运行时,Fabric在参数单元之后立即注入一个新单元格,该单元格使用管道传递的值重新分配这些变量。 此处设置的值仅初始化变量并提高可读性。
选择单元格菜单(...) >切换参数单元格 以将此单元格标记为参数单元格。
添加 OPTIMIZE 单元格
该 OPTIMIZE 命令是 Spark SQL 命令,而不是 T-SQL 命令。 必须在 Spark 环境中运行它,例如笔记本、Spark 作业定义或 Lakehouse 维护接口。 SQL 分析终结点和 Warehouse SQL 查询编辑器不支持直接此命令。
在第二个单元格中,输入:
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)根据需要添加 Markdown 单元格,以便为其他用户正确记录笔记本。 最终完成的笔记本应如下所示:
注释
本示例以已启用架构功能的 Lakehouse 为例。 如果不使用 Lakehouse schema,请相应调整 full_name 上的三段式名称。
步骤 2:创建管道
在Fabric工作区中,选择“+ 新建项>管道”。
将该管道命名为 Check-and-Optimize-Table。
选择管道画布背景,然后打开“ 参数 ”选项卡。添加三个参数:
Name 类型 默认值 lakehouse_name字符串 SalesDataLakehouseschema_name字符串 dbotable_name字符串 FactSales
步骤 3:添加脚本活动
脚本活动 sys.sp_get_table_health_metrics 在 SQL 分析终结点上运行并捕获结果。
Important
使用 脚本 活动,而不是 存储过程 活动。 只有脚本活动将结果集公开为下游活动可以分析的结构化 JSON 输出。
- 在“ 活动 ”选项卡中,选择“ 脚本 ”以将其添加到画布上。
- 将其命名 为“检查表运行状况”。
- 在 “设置” 选项卡中:
连接:选择 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活动输出中读取,并根据结果做出决策。 请执行以下步骤:
在“ 活动 ”选项卡中,选择“ If 条件 ”以将活动添加到画布上。
将其命名 为“检查异常”。
绘制一条从检查表运行状况到检查异常的成功(绿色)箭头。
在 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 分支内的子画布。
将 Notebook 活动拖到 True 子画布上。
将其命名为 “运行 OPTIMIZE”。
在“设置”选项卡中:
笔记本:选择在步骤 1 中创建的 Optimize-Table 笔记本。
展开 基参数,然后添加三行:
Name 类型 价值 lakehouse_name字符串 @pipeline().parameters.lakehouse_nameschema_name字符串 @pipeline().parameters.schema_nametable_name字符串 @pipeline().parameters.table_name
三个名称列值必须与笔记本的参数单元格中的变量名称 完全匹配。
注释
可以将错误活动留空。 If Condition 活动将空的 False 分支视为 no-op,并将管道报告为成功。
已完成的管道应如下所示:
步骤 6:验证并运行
在管道工具栏上选择“ 验证 ”以检查配置错误。
选择 “运行 ”以手动执行管道。
监控运行情况并确认:
-
检查表运行状况:在运行此活动时检查此活动的输出。 您应会看到来自
sys.sp_get_table_health_metrics存储过程的 JSON 格式输出。 -
检查异常:通过直接从脚本输出中读取
PotentialAnomalyType,可正确进行评估。 -
运行 OPTIMIZE (仅当
PotentialAnomalyType > 0): 如果 检查异常 活动评估 为 True,请查看 运行 OPTIMIZE 活动的输入以验证它是否使用正确的参数(Lakehouse 名称、架构和表名称),并检查输出以查看操作中的消息OPTIMIZE。
-
检查表运行状况:在运行此活动时检查此活动的输出。 您应会看到来自
清理资源
如果只为本教程创建了资源,并且不再需要它们,请从工作区中删除以下项:
- Check-and-Optimize-Table 管道。
- Optimize-Table 笔记本。