对 Azure Synapse Analytics 中的专用 SQL 池使用存储过程

本文提供了有关通过实现存储过程开发专用 SQL 池解决方案的提示。

可以预期什么

专用 SQL 池支持 SQL Server 中使用的许多 T-SQL 功能。 更重要的是,有一些横向扩展特定的功能可用于最大程度地提高解决方案的性能。

此外,为了帮助你维护专用 SQL 池的规模和性能,还有其他特性和功能存在行为差异。

存储过程简介

存储过程是封装 SQL 代码的好方法,它存储在专用 SQL 池数据附近。 存储过程还通过将代码封装到可管理单元中来帮助开发人员模块化解决方案,从而促进更高的代码可重用性。 每个存储过程还可以接受参数,使它们更加灵活。

专用 SQL 池提供简化的存储过程的实现。 与 SQL Server 相比,最大的区别是存储过程不是预编译代码。

通常,对于数据仓库,与针对大型数据卷运行查询所需的时间相比,编译时间很小。 请务必确保存储过程代码针对大型查询进行了正确优化。

提示

目标是节省小时、分钟和秒,而不是毫秒。 因此,将存储过程视为 SQL 逻辑的容器会很有帮助。

当专用 SQL 池执行存储过程时,会在运行时分析、转换和优化 SQL 语句。 在此过程中,每个语句将转换为分布式查询。 针对数据执行的 SQL 代码与提交的查询不同。

嵌套存储过程

当存储过程调用其他存储过程或执行动态 SQL 时,内部存储过程或代码调用被称为嵌套。

专用 SQL 池最多支持 8 个嵌套级别。 与之相比,SQL Server 中的嵌套级别为 32。

最上层存储过程调用等同于嵌套级别 1。

EXEC prc_nesting

如果存储过程还调用另一个 EXEC,则嵌套级别将增加到 2。

CREATE PROCEDURE prc_nesting
AS
EXEC prc_nesting_2  -- This call is nest level 2
GO
EXEC prc_nesting

如果第二个过程随后执行某种动态 SQL,则嵌套级别将增加到 3。

CREATE PROCEDURE prc_nesting_2
AS
EXEC sp_executesql 'SELECT 'another nest level'  -- This call is nest level 2
GO
EXEC prc_nesting

专用 SQL 池目前不支持 @@NESTLEVEL。 因此,你需要跟踪嵌套级别。 你不太可能超出 8 个嵌套级别的限制。 但是,如果你这样做,则需要重新编写代码,以适应此限制内的嵌套级别。

INSERT..EXECUTE

专用 SQL 池不允许通过 INSERT 语句使用存储过程的结果集。 但是,可以使用替代方法。 有关示例,请参阅 有关临时表的文章。

局限性

Transact-SQL 存储过程的某些方面未在专用 SQL 池中实现,如下所示:

  • 临时存储过程
  • 带编号的存储过程
  • 扩展的存储过程
  • CLR 存储过程
  • 加密选项
  • 复制选项
  • 表值参数
  • 只读参数
  • 默认参数
  • 执行上下文
  • return 语句

后续步骤

有关更多开发技巧,请参阅 开发概述