你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

最大程度减少 Netezza 迁移中的 SQL 问题

本文是一个包含七部分内容的系列的第五部分,提供有关如何从 Netezza 迁移到 Azure Synapse Analytics 的指导。 本文的重点是最大程度减少 SQL 问题的最佳做法。

概述

Netezza 环境的特征

提示

Netezza 在 2000 年代初期开创了“数据仓库设备”的概念。

2003 年,Netezza 首度发布了其数据仓库设备产品。 该产品降低了进入成本,提高了大规模并行处理 (MPP) 技术的易用性,使大规模数据处理比目前可用的现有大型机或其他 MPP 技术更高效。 此后,该产品不断发展,在大型金融机构、电信和零售公司中大量部署。 原始实现使用专有硬件,包括现场可编程门阵列(或称 FPGA),可通过 TCP/IP 经由 ODBC 或 JDBC 网络连接进行访问。

大多数现有的 Netezza 安装都是本地的,因此许多用户正在考虑将部分或全部 Netezza 数据迁移到 Azure Synapse Analytics,以获得迁移到新式云环境的优势。

提示

许多现有的 Netezza 安装都是使用维度数据模型的数据仓库。

Netezza 技术经常用于实现数据仓库,支持使用 SQL 对大型数据卷执行复杂的分析查询。 维度数据模型(星形或雪花架构)很常见,就像单个部门的数据市场实现一样常见。

这种 SQL 和维度数据模型的组合简化了迁移到 Azure Synapse 的过程,因为基本概念和 SQL 技能是可转移的。 建议的方法是按原样迁移现有数据模型,以减少风险和花费的时间。 即使最终的目的是对数据模型进行更改(例如,移动到数据仓库模型),也请执行初始的按原样迁移,然后在 Azure 云环境中进行更改,这样可利用那里的性能、弹性可扩展性和成本优势。

虽然 SQL 语言已标准化,但在某些情况下,各别供应商会实现专有扩展。 本文档重点探讨从旧的 Netezza 环境迁移时可能会遇到的 SQL 差异,并提供解决方法。

使用 Azure 数据工厂实现元数据驱动的迁移

提示

使用 Azure 数据工厂功能自动执行迁移过程。

通过利用 Azure 环境中的功能自动执行和协调迁移过程。 这种方法还可最大限度减少迁移对现有 Netezza 环境的影响,该环境可能已经接近满容量运行。

Azure 数据工厂是基于云的数据集成服务,用于在云中创建数据驱动型工作流,以便协调和自动完成数据移动和数据转换。 通过使用数据工厂,可以创建和计划数据驱动型工作流(称为“管道”),以便从不同的数据存储引入数据。 它可以使用计算服务(例如 Azure HDInsight Hadoop、Spark、Azure Data Lake Analytics、Azure 机器学习)处理和转换数据。

通过创建元数据来列出要迁移的数据表及其位置,可以使用数据工厂设施来管理和自动执行部分迁移过程。 还可以使用 Azure Synapse Pipelines

Netezza 与 Azure Synapse 之间的 SQL DDL 差异

SQL 数据定义语言 (DDL)

提示

SQL DDL 命令 CREATE TABLECREATE VIEW 具有标准核心元素,但也用于定义特定于实现的选项。

ANSI SQL 标准定义 DDL 命令(例如 CREATE TABLECREATE VIEW)的基本语法。 这些命令在 Netezza 和 Azure Synapse 中均使用,但也进行了扩展,可用于定义特定于实现的功能,例如索引、表分布和分区选项。

以下部分讨论了迁移到 Azure Synapse 的期间要考虑的特定于 Netezza 的选项。

表注意事项

提示

使用现有索引来指示迁移仓库中索引的候选项。

在不同技术之间迁移表时,只有原始数据和它的描述性元数据会在两个环境之间进行物理移动。 源系统中的其他数据库元素(如索引和日志文件)不会直接迁移,因为可能不需要这些元素,或者在新的目标环境中的实现方式不同。 例如,Netezza 的 CREATE TABLE 语法中的 TEMPORARY 选项等效于在 Azure Synapse 中为表名添加“#”字符作为前缀。

应务必了解在源环境中应用性能优化(如索引)的位置。 这表示新的目标环境中可添加性能优化的位置。 例如,如果在源 Netezza 环境中创建了区域映射,这可能表示应在迁移的 Azure Synapse 数据库中创建非聚集索引。 其他原生性能优化技术(如表复制)可能比直接的“对等”索引创建更适用。

不支持的 Netezza 数据库对象类型

提示

可以用 Azure Synapse 功能替换特定于 Netezza 的功能。

Netezza 实现 Azure Synapse 中不直接支持的一些数据库对象,但有一些方法可在新环境中实现相同的功能:

  • 区域映射:在 Netezza 中,会自动为某些列类型创建和维护区域映射,并在查询时用于限制要扫描的数据量。 区域映射是在以下列类型上创建的:

    • 长度不超过 8 字节的 INTEGER 列。
    • 临时列。 例如 DATETIMETIMESTAMP
    • CHAR 列(如果它们是具体化视图的一部分并包含在 ORDER BY 子句中)。

    可使用 NZ 工具包中的 nz_zonemap 实用工具查找哪些列有区域映射。 Azure Synapse 不包括区域映射,但你可使用其他用户定义的索引类型和/或分区来实现类似的结果。

  • 群集基表 (CBT):在 Netezza 中,CBT 通常用于事实数据表,这些表可以具有数十亿条记录。 扫描如此庞大的表需要很长的处理时间,因为可能需要进行全表扫描才能获得相关记录。 通过在限制性 CBT 上整理记录,Netezza 可对相同或邻近范围内的记录进行分组。 该过程还会创建区域映射,通过减少要扫描的数据量来提高性能。

    在 Azure Synapse 中,可使用分区和/或其他索引来实现类似的效果。

  • 具体化视图:Netezza 支持具体化视图,并建议根据包含多个列的大型表创建一个或多个此类视图,其中只有少数列经常用于查询。 当更新基表中的数据时,系统会自动维护具体化视图。

    Azure Synapse 支持具体化视图,其功能与 Netezza 相同。

Netezza 数据类型映射

提示

在准备阶段评估不受支持的数据类型的影响。

大多数 Netezza 数据类型在 Azure Synapse 中都有直接的等效项。 下表显示了这些数据类型,以及映射它们的推荐方法。

Netezza 数据类型 Azure Synapse 数据类型
BIGINT BIGINT
BINARY VARYING(n) VARBINARY(n)
BOOLEAN BIT
BYTEINT TINYINT
CHARACTER VARYING(n) VARCHAR(n)
CHARACTER(n) CHAR(n)
DATE DATE(date)
DECIMAL(p,s) DECIMAL(p,s)
DOUBLE PRECISION FLOAT
FLOAT(n) FLOAT(n)
INTEGER INT
INTERVAL Azure Synapse 目前不直接支持 INTERVAL 数据类型,但可以使用时态函数(例如 DATEDIFF)进行计算。
MONEY MONEY
NATIONAL CHARACTER VARYING(n) NVARCHAR(n)
NATIONAL CHARACTER(n) NCHAR(n)
NUMERIC(p,s) NUMERIC(p,s)
REAL REAL
SMALLINT SMALLINT
ST_GEOMETRY(n) Azure Synapse 目前不支持空间数据类型(如 ST_GEOMETRY),但数据可以作为 VARCHAR 或 VARBINARY 进行存储。
TIME TIME
TIME WITH TIME ZONE DATETIMEOFFSET
TIMESTAMP DATETIME

数据定义语言 (DDL) 生成

提示

使用现有的 Netezza 元数据自动为 Azure Synapse 生成 CREATE TABLECREATE VIEW DDL。

编辑现有的 Netezza CREATE TABLECREATE VIEW 脚本,以创建具有修改的数据类型的等效定义,如前所述(如有必要)。 通常,这涉及到删除或修改任何特定于 Netezza 的额外子句,例如 ORGANIZE ON

但用于指定现有 Netezza 环境中表和视图的当前定义的所有信息都被保存在系统目录表中。 这是这些信息的最佳来源,因为可确保这些表是最新的和完整的。 请注意,用户维护的文档可能与当前表定义不同步。

使用 nz_ddl_table 等实用程序访问此信息,并生成 CREATE TABLE DDL 语句。 针对 Azure Synapse 中的等效表编辑这些语句。

提示

第三方工具和服务可以自动执行数据映射任务。

将有 Microsoft 合作伙伴提供工具和服务来自动执行迁移,包括数据类型映射。 并且,如果已在 Netezza 环境中使用第三方 ETL 工具(如 Informatica 或 Talend),这些工具可以实现任何所需的数据转换。

Netezza 与 Azure Synapse 之间的 SQL DML 差异

SQL 数据操作语言 (DML)

提示

SQL DML命令 SELECTINSERTUPDATE 具有标准的核心元素,但也可以实现不同的语法选项。

ANSI SQL 标准定义 DML 命令(例如 SELECTINSERTUPDATEDELETE)的基本语法。 Netezza 和 Azure Synapse 都使用这些命令,但在某些情况下存在实现上的差异。

以下部分讨论在迁移到 Azure Synapse 的期间应考虑的特定于 Netezza 的 DML 命令。

SQL DML 语法差异

在迁移时,请注意,SQL 数据操作语言 (DML) 语法在 Netezza SQL 与 Azure Synapse 之间存在这些差异:

  • STRPOS:在 Netezza 中,STRPOS 函数返回字符串中 substring 的位置。 Azure Synapse 中的等效函数是 CHARINDEX 函数,但参数的顺序相反。 例如,Netezza 中的 SELECT STRPOS('abcdef','def')... 等效于 Azure Synapse 中的 SELECT CHARINDEX('def','abcdef')...

  • AGE:Netezza 支持 AGE 运算符,以在两个临时值(如时间戳或日期)之间提供间隔。 例如,SELECT AGE('23-03-1956','01-01-2019') FROM... 。 在 Azure Synapse 中,DATEDIFF 提供间隔。 例如,SELECT DATEDIFF(day, '1956-03-26','2019-01-01') FROM... 。 记下日期表示形式序列。

  • NOW():Netezza 使用 NOW() 在 Azure Synapse 中代表 CURRENT_TIMESTAMP

函数、存储过程和序列

提示

在准备阶段,需要评估要迁移的非数据对象的数量和类型。

从成熟的旧数据仓库环境(如 Netezza)迁移时,需要迁移到新的目标环境的除了简单的表和视图之外,通常还有其他元素。 例子包括函数、存储过程和序列。

在准备阶段,需要创建要迁移的对象的清单,并定义处理它们的方法。 然后在项目计划中分配适当的资源。

Azure 环境中可能存在一些设施,会替代在 Netezza 环境中作为函数或存储过程实现的功能。 在这种情况下,使用内置的 Azure 设施而不是重新编码 Netezza 函数通常会更高效。

提示

第三方产品和服务可以自动迁移非数据元素。

Microsoft 合作伙伴提供可自动执行迁移的工具和服务,包括数据类型的映射。 并且,已在 IBM Netezza 环境中使用的第三方 ETL 工具(如 Informatica 或 Talend)可以实现任何必需的数据转换。

有关其中每个元素的详细信息,请参阅以下部分。

函数

与大多数数据库产品一样,Netezza 在 SQL 实现中支持系统函数和用户定义的函数。 迁移到另一个数据库平台(如 Azure Synapse)时,可以使用常见的系统函数,且无需更改即可迁移。 某些系统函数的语法可能略有不同,但可以自动执行所需的更改。 对于没有等效函数(如用户定义的任意函数)的系统函数,可能需要使用目标环境中可用的语言对其重新编码。 Azure Synapse 使用常用的 Transact-SQL 语言来实现用户定义函数。 Netezza 用户定义的函数用 nzlua 或 C++ 语言进行编码。

存储过程

大多数新式数据库产品支持将过程存储在数据库中。 Netezza 提供 NZPLSQL 语言,该语言基于 Postgres PL/pgSQL。 存储过程通常包含 SQL 语句和一些过程逻辑,并可能返回数据或状态。

Azure Synapse Analytics 还支持使用 T-SQL 的存储过程,因此,如果必须迁移存储过程,请相应地对它们重新编码。

序列

在 Netezza 中,序列是通过 CREATE SEQUENCE 创建的命名数据库对象,它可以通过 NEXT VALUE FOR 方法提供唯一值。 可以使用其来生成唯一编号,充当主键值的代理键值。

在 Azure Synapse 中,没有 CREATE SEQUENCE。 序列通过使用 IDENTITY 来进行处理,以使用 SQL 代码创建代理键托管标识,从而创建系列中的下一个序列号。

使用 EXPLAIN 验证旧 SQL

提示

通过使用现有系统查询日志中的真实查询来查找潜在的迁移问题。

从旧查询历史记录日志中捕获一些具有代表性的 SQL 语句,以评估旧版 Netezza SQL 是否与 Azure Synapse 兼容。 然后添加 EXPLAIN 作为这些查询的前缀,在 Azure Synapse 中使用相同的表名和列名假设一个“对等”的迁移数据模型,并在 Azure Synapse 中运行这些 EXPLAIN 语句。 任何不兼容的 SQL 都将返回错误。 使用此信息来确定重编码任务的规模。 此方法不需要将数据加载到 Azure 环境中,只要求创建相关的表和视图。

IBM Netezza 到 T-SQL 映射

此表中显示了符合 Azure Synapse SQL 数据类型映射的 IBM Netezza 到 T-SQL 映射:

IBM Netezza 数据类型 Azure Synapse SQL 数据类型
array 不支持
bigint bigint
binary large object [(n[K|M|G])] nvarchar [(n|max)]
 blob [(n[K|M|G])] nvarchar [(n|max)]
 byte [(n)] binary [(n)]|varbinary(max)
 byteint smallint
 char varying [(n)] varchar [(n|max)]
character varying [(n)] varchar [(n|max)]
 char [(n)] char [(n)]|varchar(max)
character [(n)] char [(n)]|varchar(max)
 character large object [(n[K|M|G])] varchar [(n|max)
 clob [(n[K|M|G])] varchar [(n|max)
 dataset 不支持 
 date date
 dec [(p[,s])] decimal [(p[,s])]
 decimal [(p[,s])] decimal [(p[,s])]
 双精度 float(53)
 float [(n)] float [(n)]
 graphic [(n)] nchar [(n)]| varchar(max)
 interval 不支持 
 json [(n)] nvarchar [(n|max)]
 长 varchar nvarchar(max)
 long vargraphic nvarchar(max)
 mbb 不支持 
 mbr 不支持 
 number [((p|*)[,s])] numeric [(p[,s])]
 numeric [(p [,s])]  numeric [(p[,s])]
 period 不支持 
 real  real
 smallint smallint
 st_geometry 不支持 
 time time
 time with time zone datetimeoffset
 timestamp  datetime2
 timestamp with time zone datetimeoffset
 varbyte varbinary [(n|max)]
 varchar [(n)]  varchar [(n)]
 vargraphic [(n)] nvarchar [(n|max)]
 varray 不支持 
 xml 不支持 
 xmltype 不支持 

总结

典型的现有旧版 Netezza 安装是采用一种使迁移到 Azure Synapse 变得简单的方式实现的。 该方法使用 SQL 对大型数据卷进行分析查询,并且采用某种形式的维度数据模型。 这些因素使其非常适合迁移到 Azure Synapse。

若要最大程度减少迁移实际 SQL 代码的任务,请遵循以下建议:

  • 数据仓库的初始迁移应按原样进行,以尽量减少风险和花费的时间,即使最后的最终环境将合并不同的数据模型(如数据保管库)也是如此。

  • 了解 Netezza SQL 实现与 Azure Synapse 之间的差异。

  • 使用现有 Netezza 实现中的元数据和查询日志来评估差异的影响,并规划缓解方法。

  • 尽可能自动执行该过程,以最大程度减少迁移中发生的错误、风险和所用时间。

  • 请考虑使用专业的 Microsoft 合作伙伴和服务来简化迁移。

后续步骤

若要详细了解 Microsoft 和第三方工具,请参阅本系列中的下一篇文章:用于将 Netezza 数据仓库迁移到 Azure Synapse Analytics 的工具