幕后的 Azure Synapse Pathway
Azure Synapse Pathway 的目标是在针对 Synapse SQL 进行优化的同时,保留原始代码的功能意图。 Synapse Pathway 使用一个三阶段过程将 SQL 代码从源系统转换到 Azure Synapse SQL。
每一个阶段都保留并增加了源的知识(包括特定于源的元数据),以确保最高质量的转换。
阶段 1 - 词法和句法分析
SQL 语言分析是一个已经解决了很多次的问题。 许多商业和开源分析程序都有助于执行以下基础过程:获取一个源语句,将其分解成逻辑标记,然后针对集或分析程序规则执行,以确保语言的一致性。
Synapse Pathway 定义了源语法,该语法允许工具识别并处理输入到用于进一步处理的已扩充抽象语法树 (AST) 中的 SQL。
阶段 2 - 已扩充的抽象语法树 (AST)
Synapse Pathway 定义了已扩充抽象语法树 (AST) 中所有对象的常见表示形式。 Pathway AST 包含来自其他语句或片段的元数据,能帮助正确转换语句。
脚本生成组件不仅会跟踪令牌是一个函数,还会跟踪源系统类型需求,从而可对转换到 Synapse SQL 做出更明智的决策。
例如,绝对函数的源函数被定义为:
ABS( float_expression )
Azure Synapse SQL 将绝对函数定义为:
ABS ( numeric_expression )
在此简单示例中,Synapse Pathway 理解 Synapse SQL 中从浮点到数值的转换是隐式的转换,不需要进一步的类型强制转换。 简单、简洁且有效的代码转换。
保留关于源语句和片段的元数据信息有助于区分平台之间的结构差异 - 例如,WHERE 子句中搜索条件谓词的选择退出逻辑中的转换。
阶段 3 - 语法生成
该过程的最后一个阶段是生成 Synapse SQL 的语法。 使用从源文件生成的 AST 结构,Synapse Pathway 将每个 DDL 对象写入单个文件。 语法生成器使用目标平台的深度知识来优化语句。
例如,在数据加载场景中常见的一种模式是先删除一个临时表中的所有内容,然后以 INSERT/SELECT 方式从另一个临时表中加载数据。
DELETE staging.table1 ALL;
INSERT INTO staging.table1…
FROM staging.table2;
Synapse SQL 具有针对此场景的优化路径 - CREATE TABLE AS SELECT。 CTAS 语句是一种基于批处理的操作,通过使用所有可用的计算基础结构来按最小方式进行记录,从而实现高性能。 如果没有对 Synapse SQL 的这种见解,工具通常会生成一个截断和 INSERT/SELECT 语句。
TRUNCATE TABLE staging.table1;
INSERT INTO staging.table1…
FROM staging.table2;
虽然这尚算不错,但此代码可以优化为 DROP TABLE 和 CTAS,以获得更高的性能。
DROP TABLE staging.table1;
CREATE TABLE staging.table1
WITH
(
-- Derived from the original table definition
DISTRIBUTION = HASH(column1),
-- Derived from the original table definition
CLUSTERED COLUMNSTORE INDEX
)
AS SELECT * FROM staging.table2;