Azure Synapse SQL 中的分发顾问

适用于:Azure Synapse Analytics 专用 SQL 池(以前称为 SQL DW)

在 Azure Synapse SQL 中,每个表都使用客户选择的策略(轮循机制、哈希分发、复制)进行分发。 所选的分发策略可能会极大地影响查询性能。

Azure Synapse SQL 的分发顾问 (DA) 功能可分析客户查询,并推荐表的最佳分发策略以提高查询性能。 顾问考虑的查询可由客户提供,也可以从 DMV 中提供的历史查询拉取。

注意

对于 Azure Synapse Analytics,分发顾问功能目前仅提供预览版。 预览功能仅用于测试,不应用于生产实例或生产数据。 作为预览功能,分发顾问可能会在行为或功能方面发生变化。 如果数据很重要,还请保留测试数据的副本。 分发顾问不支持多列分布式表。

先决条件

  • 执行 T-SQL 语句 SELECT @@version,确保 Azure Synapse Analytics 专用 SQL 池版本为 10.0.15669 或更高版本。 如果版本较低,新版本应会在维护周期内自动到达预配的专用 SQL 池。

  • 在运行顾问之前,请确保统计信息可用且保持最新。 有关统计信息的更多详情,请参阅管理表统计信息CREATE STATISTICSUPDATE STATISTICS 文章。

  • 使用 SET RECOMMENDATIONS T-SQL 命令为当前会话启用 Azure Synapse 分发顾问。

分析工作负载并生成分发建议

以下教程介绍了使用分发顾问功能分析客户查询并推荐最佳分发策略的示例用例。

分发顾问仅分析用户表上运行的查询。

1. 创建分发顾问存储过程

若要轻松运行顾问,请在数据库中创建两个新的存储过程。 运行可从 GitHub 下载的 CreateDistributionAdvisor_PublicPreview 脚本

命令 说明
dbo.write_dist_recommendation 定义 DA 将分析的查询。 可以手动提供查询,也可以从 sys.dm_pdw_exec_requests 中的实际工作负载读取多达 100 个过去的查询。
dbo.read_dist_recommendation 运行顾问并生成建议。

下面是有关如何运行顾问的示例。

2a. 在 DMV 中过去的工作负载上运行顾问

运行以下命令,读取工作负载中最后 100 个查询,以获取分析和分发建议:

EXEC dbo.write_dist_recommendation <Number of Queries max 100>, NULL
go
EXEC dbo.read_dist_recommendation;
go

若要查看 DA 分析的查询,请运行可从 GitHub 下载的 e2e_queries_used_for_recommendations.sql 脚本

2b. 对所选查询运行顾问

dbo.write_dist_recommendation 中的第一个参数应设置为 0,第二个参数是 DA 将分析的最多 100 个查询的分号分隔列表。 在下面的示例中,我们希望看到两个用分号分隔的语句 select count (*) from t1;select * from t1 join t2 on t1.a1 = t2.a1; 的分发建议。

EXEC dbo.write_dist_recommendation 0, 'select count (*) from t1; select * from t1 join t2 on t1.a1 = t2.a1;'
go
EXEC dbo.read_dist_recommendation;
go

3. 查看建议

执行完成时,dbo.read_dist_recommendation 系统存储过程将按照以下格式返回建议:

列名 说明
Table_name DA 分析的表。 无论建议如何更改,每个表一行。
Current_Distribution 当前表分发策略。
Recommended_Distribution 建议的分发。 如果没有建议的更改,这可以与 Current_Distribution 相同。
Distribution_Change_Command 用于实现建议的 CTAS T-SQL 命令。

4. 实施建议

  • 运行分发顾问提供的 CTAS 命令,使用建议的分发策略创建新表。
  • 修改查询以在新表上运行。
  • 对旧表和新表执行查询,比较性能提升情况。

故障排除

本部分包含常见的故障排除方案和可能会遇到的常见错误。

1. 以前运行顾问的过时状态

1a. 故障描述:

运行顾问时会看到以下错误消息:

Msg 110813, Level 16, State 1, Line 1
Calling GetLastScalarResult() before executing scalar subquery.
1b. 缓解操作:
  • 验证是否使用单引号 '' 对所选查询运行顾问。
  • 在 SSMS 中启动新会话并运行顾问。

2. 运行顾问期间出错

2a. 故障描述:

“result”窗格显示下面的 CommandToInvokeAdvisorString,但不显示下面的 RecommendationOutput

例如,只能看到 Command_to_Invoke_Distribution_Advisor 结果集。

Screenshot of the output of a T-SQL result showing the Command_to_Invoke_Distribution_Advisor.

但不包含表更改 T-SQL 命令的第二个结果集:

Screenshot of the output of a T-SQL result showing the Command_to_Invoke_Distribution_Advisor with a second resultset containing table change T-SQL commands.

2b. 缓解操作:
  • 查看上方 CommandToInvokeAdvisorString 的输出。

  • 删除可能不再有效的查询,这些查询可能是通过编辑 DA 考虑的查询中的 WHERE 子句,从手动选择的查询或从 DMV 添加到此处的。

3. 在后期处理建议输出时出错

3a. 故障描述:

会看到以下错误消息。

Invalid length parameter passed to the LEFT or SUBSTRING function.
3b. 缓解操作:

确保从 GitHub 获取最新版本的存储过程:

后续步骤