Compartilhar via

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 脚本

指令 DESCRIPTION
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 分析的表。 每个表格只有一行,无论建议有没有变化。
当前分布 当前的表分发策略。
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. 故障描述:

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

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

显示Command_to_Invoke_Distribution_Advisor的 T-SQL 结果输出的屏幕截图。

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

T-SQL 结果输出的屏幕截图,显示了 `Command_to_Invoke_Distribution_Advisor` 命令,其第二个结果集中包含了表更改的 T-SQL 命令。

2b. 缓解:
  • 检查上面 CommandToInvokeAdvisorString 的输出。

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

3. 建议输出后期处理期间出错

3a. 故障描述:

会看到以下错误消息。

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

确保具有GitHub中存储过程的最新版本:

后续步骤