你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
最大程度减少 Teradata 迁移中的 SQL 问题
本文是一个包含七部分的系列教程的第五部分,提供有关如何从 Teradata 迁移到 Azure Synapse Analytics 的指导。 本文的重点是最大程度减少 SQL 问题的最佳做法。
概述
Teradata 环境的特征
提示
Teradata 在 20 世纪 80 年代开创了使用 MPP 的大规模 SQL 数据库。
1984 年,Teradata 首度发布了其数据库产品。 该产品引入了大规模并行处理 (MPP) 技术,使大规模数据处理比目前可用的现有大型机技术更高效。 此后,该产品不断发展,在大型金融机构、电信和零售公司中大量部署。 其原始实现使用了专有硬件,并通过通道附加到大型机 - 通常是 IBM 或与 IBM 兼容的处理器。
虽然最近发布的公告包括了网络连接性和 Teradata 技术栈在云(包括 Azure)中的可用性,但大多数现有安装都在本地进行,因此许多用户正在考虑将部分或全部 Teradata 数据迁移到 Azure Synapse Analytics,以获得迁移到现代云环境的优势。
提示
许多现有的 Teradata 安装都是使用维度数据模型的数据仓库。
Teradata 技术经常用于实现数据仓库,支持使用 SQL 对大型数据卷执行复杂的分析查询。 维度数据模型(星形或雪花架构)很常见,就像单个部门的数据市场实现一样常见。
这种 SQL 和维度数据模型的组合简化了迁移到 Azure Synapse 的过程,因为基本概念和 SQL 技能是可转移的。 建议的方法是按原样迁移现有数据模型,以减少风险和花费的时间。 即使最终的目的是对数据模型进行更改(例如,移动到数据仓库模型),也请执行初始的按原样迁移,然后在 Azure 云环境中进行更改,这样可利用那里的性能、弹性可扩展性和成本优势。
虽然 SQL 语言已标准化,但在某些情况下,各别供应商会实现专有扩展。 本文档重点探讨从旧的 Teradata 环境迁移时可能会遇到的 SQL 差异,并提供解决方法。
在迁移过程中,请使用 Azure VM Teradata 实例
提示
使用 Azure VM 创建临时 Teradata 实例,以加快迁移速度并将对源系统的影响降至最低。
从本地 Teradata 环境迁移时,可以利用 Azure 环境。 Azure 提供可负担的云存储空间和弹性可伸缩性,以在 Azure 的 VM 中创建 Teradata 实例,并与目标 Azure Synapse 环境搭配使用。
借助此方法,标准 Teradata 实用工具(如 Teradata Parallel Data Transporter)或第三方数据复制工具(如 Attunity Replicate)可用于高效地移动需要迁移到 VM 实例的 Teradata 表子集,然后可以在 Azure 环境中执行所有迁移任务。 此方法具有以下几个优点:
完成数据初始复制后,源系统不受迁移任务的影响。
Azure 环境中提供了熟悉的 Teradata 接口、工具和实用工具。
进入 Azure 环境后,本地源系统和云目标系统之间的网络带宽可用性不会出现潜在问题。
Azure 数据工厂等工具可高效调用 Teradata Parallel Transporter 等实用工具,以快速轻松地迁移数据。
迁移过程完全在 Azure 环境内部进行协调和控制。
使用 Azure 数据工厂实现元数据驱动的迁移
提示
使用 Azure 数据工厂功能自动执行迁移过程。
通过利用 Azure 环境中的功能自动执行和协调迁移过程。 这种方法还可最大限度减少迁移对现有 Teradata 环境的影响,该环境可能已经接近满容量运行。
Azure 数据工厂是基于云的数据集成服务,用于在云中创建数据驱动型工作流,以便协调和自动完成数据移动和数据转换。 通过使用数据工厂,可以创建和计划数据驱动型工作流(称为“管道”),以便从不同的数据存储引入数据。 它可以使用计算服务(例如 Azure HDInsight Hadoop、Spark、Azure Data Lake Analytics、Azure 机器学习)处理和转换数据。
通过创建元数据来列出要迁移的数据表及其位置,可以使用数据工厂设施来管理和自动执行部分迁移过程。 还可以使用 Azure Synapse Pipelines。
Teradata 与 Azure Synapse 之间的 SQL DDL 设计差异
SQL 数据定义语言 (DDL)
提示
SQL DDL 命令 CREATE TABLE
和 CREATE VIEW
具有标准核心元素,但也用于定义特定于实现的选项。
ANSI SQL 标准定义 DDL 命令(例如 CREATE TABLE
和 CREATE VIEW
)的基本语法。 这些命令在 Teradata 和 Azure Synapse 中均使用,但也进行了扩展,可用于定义特定于实现的功能,例如索引、表分布和分区选项。
以下部分讨论了迁移到 Azure Synapse 的期间要考虑的特定于 Teradata 的选项。
表注意事项
提示
使用现有索引来指示迁移仓库中索引的候选项。
在不同技术之间迁移表时,只有原始数据和它的描述性元数据会在两个环境之间进行物理移动。 源系统中的其他数据库元素(如索引和日志文件)不会直接迁移,因为可能不需要这些元素,或者在新的目标环境中的实现方式不同。 例如,Teradata 的 CREATE TABLE
语法中没有 MULTISET
选项的的等效项。
应务必了解在源环境中应用性能优化(如索引)的位置。 这表示新的目标环境中可添加性能优化的位置。 例如,如果在源 Teradata 环境中创建了非唯一辅助索引 (NUSI),这可能表明应在已迁移的 Azure Synapse 数据库中创建非聚集索引。 其他原生性能优化技术(如表复制)可能比直接的“类似”索引创建更适用。
不支持的 Teradata 表类型
提示
Azure Synapse 中的标准表可以支持迁移的 Teradata 时序和时态表。
Teradata 包含对时序和时态数据的特殊表类型的支持。 Azure Synapse 不直接支持这些表类型的语法和某些函数,但可以将数据迁移到具有适当数据类型的标准表中,并按日期/时间列编制索引或分区。
Teradata 通过查询重写来实现时态查询功能,以在时态查询中添加额外的筛选器来限制适用的日期范围。 如果当前正在源 Teradata 环境中使用此功能并且要进行迁移,则需要将此额外筛选添加到相关的临时查询中。
Azure 环境还包括用于大规模对时序数据进行复杂分析的特定功能(称为时序见解),此功能面向 IoT 数据分析应用程序,可能更适合此用例。
不受支持的 Teradata 数据类型
提示
在准备阶段评估不受支持的数据类型的影响。
大多数 Teradata 数据类型在 Azure Synapse 中都有直接的等效项。 下表显示了 Azure Synapse 中不支持的 Teradata 数据类型以及推荐的映射。 在该表中,Teradata 列类型是存储在系统目录中的类型(例如,在 DBC.ColumnsV
中)。
Teradata 列类型 | Teradata 数据类型 | Azure Synapse 数据类型 |
---|---|---|
++ | TD_ANYTYPE | Azure Synapse 中不支持 |
A1 | ARRAY | Azure Synapse 中不支持 |
AN | ARRAY | Azure Synapse 中不支持 |
AT | TIME | TIME |
BF | BYTE | BINARY |
BO | BLOB | BLOB 数据类型不直接受支持,但可以替换为 BINARY。 |
BV | VARBYTE | BINARY |
CF | VARCHAR | CHAR |
CO | CLOB | CLOB 数据类型不直接受支持,但可以替换为 VARCHAR。 |
CV | VARCHAR | VARCHAR |
D | DECIMAL | DECIMAL |
DA | DATE | DATE |
DH | INTERVAL DAY TO HOUR | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
DM | INTERVAL DAY TO MINUTE | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
DS | INTERVAL DAY TO SECOND | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
DT | 数据集 | Azure Synapse 支持 DATASET 数据类型。 |
DY | INTERVAL DAY | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
F | FLOAT | FLOAT |
HM | INTERVAL HOUR TO MINUTE | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
HR | INTERVAL HOUR | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
HS | INTERVAL HOUR TO SECOND | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
I1 | BYTEINT | TINYINT |
I2 | SMALLINT | SMALLINT |
I8 | BIGINT | BIGINT |
I | INTEGER | INT |
JN | JSON | JSON 数据类型目前在 Azure Synapse 中不直接受支持,但 JSON 数据可以存储在 VARCHAR 字段中。 |
MI | INTERVAL MINUTE | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
MO | INTERVAL MONTH | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
MS | INTERVAL MINUTE TO SECOND | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
N | NUMBER | NUMERIC |
PD | PERIOD(DATE) | 可以转换为 VARCHAR 或拆分为两个单独的日期 |
PM | PERIOD (TIMESTAMP WITH TIME ZONE) | 可以转换为 VARCHAR 或拆分为两个单独的时间戳 (DATETIMEOFFSET) |
PS | PERIOD(TIMESTAMP) | 可以转换为 VARCHAR 或拆分为两个单独的时间戳 (DATETIMEOFFSET) |
PT | PERIOD(TIME) | 可以转换为 VARCHAR 或拆分为两个单独的时间 |
PZ | PERIOD (TIME WITH TIME ZONE) | 可以转换为 VARCHAR 或拆分为两个单独的时间,但 TIME 不支持 WITH TIME ZONE |
SC | INTERVAL SECOND | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
SZ | TIMESTAMP WITH TIME ZONE | DATETIMEOFFSET |
TS | TIMESTAMP | DATETIME or DATETIME2 |
TZ | TIME WITH TIME ZONE | 不支持 TIME WITH TIME ZONE,因为 TIME 仅使用“壁挂钟”时间存储,而无时区偏移量。 |
XM | XML | XML 数据类型目前在 Azure Synapse 中不直接受支持,但 XML 数据可以存储在 VARCHAR 字段中。 |
YM | INTERVAL YEAR TO MONTH | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
YR | INTERVAL YEAR | Azure Synapse 不支持 INTERVAL 数据类型,但可以使用日期比较函数来计算日期(例如,DATEDIFF 和 DATEADD)。 |
使用 Teradata 目录表中的元数据来确定是否要迁移其中的任何数据类型,然后在迁移计划中允许其迁移。 例如,使用这样的 SQL 查询来查找不受支持的但需要关注的数据类型的任何实例。
SELECT
ColumnType, CASE
WHEN ColumnType = '++' THEN 'TD_ANYTYPE'
WHEN ColumnType = 'A1' THEN 'ARRAY' WHEN
ColumnType = 'AN' THEN 'ARRAY' WHEN
ColumnType = 'BO' THEN 'BLOB'
WHEN ColumnType = 'CO' THEN 'CLOB'
WHEN ColumnType = 'DH' THEN 'INTERVAL DAY TO HOUR' WHEN
ColumnType = 'DM' THEN 'INTERVAL DAY TO MINUTE' WHEN
ColumnType = 'DS' THEN 'INTERVAL DAY TO SECOND' WHEN
ColumnType = 'DT' THEN 'DATASET'
WHEN ColumnType = 'DY' THEN 'INTERVAL DAY'
WHEN ColumnType = 'HM' THEN 'INTERVAL HOUR TO MINUTE' WHEN
ColumnType = 'HR' THEN 'INTERVAL HOUR'
WHEN ColumnType = 'HS' THEN 'INTERVAL HOUR TO SECOND' WHEN
ColumnType = 'JN' THEN 'JSON'
WHEN ColumnType = 'MI' THEN 'INTERVAL MINUTE' WHEN
ColumnType = 'MO' THEN 'INTERVAL MONTH'
WHEN ColumnType = 'MS' THEN 'INTERVAL MINUTE TO SECOND' WHEN
ColumnType = 'PD' THEN 'PERIOD(DATE)'
WHEN ColumnType = 'PM' THEN 'PERIOD (TIMESTAMP WITH TIME ZONE)'
WHEN ColumnType = 'PS' THEN 'PERIOD(TIMESTAMP)' WHEN
ColumnType = 'PT' THEN 'PERIOD(TIME)'
WHEN ColumnType = 'PZ' THEN 'PERIOD (TIME WITH TIME ZONE)' WHEN
ColumnType = 'SC' THEN 'INTERVAL SECOND'
WHEN ColumnType = 'SZ' THEN 'TIMESTAMP WITH TIME ZONE' WHEN
ColumnType = 'XM' THEN 'XML'
WHEN ColumnType = 'YM' THEN 'INTERVAL YEAR TO MONTH' WHEN
ColumnType = 'YR' THEN 'INTERVAL YEAR'
END AS Data_Type,
COUNT (*) AS Data_Type_Count FROM
DBC.ColumnsV
WHERE DatabaseName IN ('UserDB1', 'UserDB2', 'UserDB3') -- select databases to be migrated
GROUP BY 1,2
ORDER BY 1;
提示
第三方工具和服务可以自动执行数据映射任务。
将有第三方供应商提供工具和服务来自动执行迁移,包括数据类型的映射。 如果已在 Teradata 环境中使用第三方 ETL 工具(如 Informatica 或 Talend),这些工具可以实现任何必需的数据转换。
数据定义语言 (DDL) 生成
提示
使用现有的 Teradata 元数据自动为 Azure Synapse 生成 CREATE TABLE
和 CREATE VIEW DDL
。
编辑现有的 Teradata CREATE TABLE
和 CREATE VIEW
脚本,以创建具有修改的数据类型的等效定义,如前所述(如有必要)。 通常,这涉及到删除特定于 Teradata 的额外子句,例如 FALLBACK
或 MULTISET
。
但用于指定现有 Teradata 环境中表和视图的当前定义的所有信息都被保存在系统目录表中。 这是这些信息的最佳来源,因为可确保这些表是最新的和完整的。 请注意,用户维护的文档可能与当前表定义不同步。
通过目录上的视图访问此信息,例如 DBC.ColumnsV
,并为 Azure Synapse 中的等效表生成等效 的 CREATE TABLE
DDL 语句。
提示
第三方工具和服务可以自动执行数据映射任务。
将有 Microsoft 合作伙伴提供工具和服务来自动执行迁移,包括数据类型映射。 并且,如果已在 Teradata 环境中使用第三方 ETL 工具(如 Informatica 或 Talend),这些工具可以实现任何所需的数据转换。
Teradata 与 Azure Synapse 之间的 SQL DML 设计差异
SQL 数据操作语言 (DML)
提示
SQL DML命令 SELECT
、INSERT
和 UPDATE
具有标准的核心元素,但也可以实现不同的语法选项。
ANSI SQL 标准定义 DML 命令(例如 SELECT
、INSERT
、UPDATE
和 DELETE
)的基本语法。 Teradata 和 Azure Synapse 都使用这些命令,但在某些情况下存在实现上的差异。
以下部分讨论在迁移到 Azure Synapse 的期间应考虑的特定于 Teradata 的 DML 命令。
SQL DML 语法差异
在迁移时,请注意,SQL 数据操作语言 (DML) 语法在 Teradata SQL 与 Azure Synapse (T-SQL) 之间存在这些差异:
QUALIFY
:Teradata 支持QUALIFY
运算符。 例如:SELECT col1 FROM tab1 WHERE col1='XYZ' QUALIFY ROW_NUMBER () OVER (PARTITION by col1 ORDER BY col1) = 1;
等效的 Azure Synapse 语法是:
SELECT * FROM ( SELECT col1, ROW_NUMBER () OVER (PARTITION by col1 ORDER BY col1) rn FROM tab1 WHERE col1='XYZ' ) WHERE rn = 1;
日期算术:Azure Synapse 具有可用于
DATE
或DATETIME
字段的运算符,例如DATEADD
和DATEDIFF
。 Teradata 支持对日期进行直接减法运算,例如SELECT DATE1 - DATE2 FROM...
在
GROUP BY
序号中,显式提供 T-SQL 列名。LIKE ANY
:Teradata 支持LIKE ANY
语法,例如:SELECT * FROM CUSTOMER WHERE POSTCODE LIKE ANY ('CV1%', 'CV2%', 'CV3%');
Azure Synapse 中等效的语法是:
SELECT * FROM CUSTOMER WHERE (POSTCODE LIKE 'CV1%') OR (POSTCODE LIKE 'CV2%') OR (POSTCODE LIKE 'CV3%');
根据系统设置,默认情况下 Teradata 中的字符比较可能不区分大小写。 在 Azure Synapse 中,字符比较始终区分大小写。
使用 EXPLAIN 验证旧 SQL
提示
通过使用现有系统查询日志中的真实查询来查找潜在的迁移问题。
测试旧版 Teradata SQL 与 Azure Synapse 的兼容性的一种方法是从旧版系统查询日志中捕获一些有代表性的 SQL 语句,并用 EXPLAIN 作为这些查询的前缀(假设 Azure Synapse 中有对等的迁移后的数据模型,具有与原来相同的表名和列名),在 Azure Synapse 中运行这些 EXPLAIN
语句。 任何不兼容的 SQL 都会引发错误- 使用错误信息来确定重编码任务的规模。 此方法不需要将数据加载到 Azure 环境中,只要求创建相关的表和视图。
函数、存储过程、触发器和序列
提示
在准备阶段,需要评估要迁移的非数据对象的数量和类型。
从成熟的旧数据仓库环境(如 Teradata)迁移时,需要迁移到新的目标环境的除了简单的表和视图之外,通常还有其他元素。 其示例包括函数、存储过程、触发器和序列。
在准备阶段,需要创建要迁移的对象的清单,并定义处理它们的方法。 然后在项目计划中分配适当的资源。
Azure 环境中可能存在一些设施,会替换在 Teradata 环境中作为函数或存储过程实现的功能。 在这种情况下,使用内置的 Azure 设施而不是重新编码 Teradata 函数通常会更高效。
提示
第三方产品和服务可以自动迁移非数据元素。
Microsoft 合作伙伴提供可实现自动迁移的工具和服务。
有关其中每个元素的详细信息,请参阅以下部分。
函数
与大多数数据库产品一样,Teradata 在 SQL 实现中支持系统函数和用户定义的函数。 迁移到另一个数据库平台(如 Azure Synapse)时,可以使用常见的系统函数,且无需更改即可迁移。 某些系统函数的语法可能略有不同,但可以自动执行所需的更改。 对于没有等效函数(如用户定义的任意函数)的系统函数,可能需要使用目标环境中可用的语言对其重新编码。 Azure Synapse 使用常用的 Transact-SQL 语言来实现用户定义函数。
存储过程
大多数新式数据库产品支持将过程存储在数据库中。 为此,Teradata 提供了 SPL 语言。 存储过程通常包含 SQL 语句和一些过程逻辑,并可能返回数据或状态。
Azure Synapse Analytics 的专用 SQL 池还支持使用 T-SQL 的存储过程,因此,如果必须迁移存储过程,请相应地重新编码它们。
触发器
Azure Synapse 不支持创建触发器,但可以在 Azure 数据工厂中实现它们。
序列
Azure Synapse 序列的处理方式与 Teradata 类似,使用 IDENTITY 来创建代理键或托管标识。
Teradata 到 T-SQL 映射
下表显示了符合 Azure Synapse SQL 数据类型映射的 Teradata 到 T-SQL 映射:
Teradata 数据类型 | Azure Synapse SQL 数据类型 |
---|---|
bigint | bigint |
bool | bit |
boolean | bit |
byteint | tinyint |
char [(p)] | char [(p)] |
char varying [(p)] | varchar [(p)] |
character [(p)] | char [(p)] |
character varying [(p)] | varchar [(p)] |
date | date |
datetime | datetime |
dec [(p[,s])] | decimal [(p[,s])] |
decimal [(p[,s])] | decimal [(p[,s])] |
Double | float(53) |
双精度 | float(53) |
float [(p)] | float [(p)] |
float4 | float(53) |
float8 | float(53) |
int | int |
int1 | tinyint |
int2 | smallint |
int4 | int |
int8 | bigint |
integer | integer |
interval | 不支持 |
national char varying [(p)] | nvarchar [(p)] |
national character [(p)] | nchar [(p)] |
national character varying [(p)] | nvarchar [(p)] |
nchar [(p)] | nchar [(p)] |
numeric [(p[,s])] | numeric [(p[,s]) |
nvarchar [(p)] | nvarchar [(p)] |
real | real |
smallint | smallint |
time | time |
time with time zone | datetimeoffset |
time without time zone | time |
timespan | 不支持 |
timestamp | datetime2 |
timetz | datetimeoffset |
varchar [(p)] | varchar [(p)] |
总结
典型的现有旧版 Teradata 安装是采用一种使迁移到 Azure Synapse 变得简单的方式实现的。 该方法使用 SQL 对大型数据卷进行分析查询,并且采用某种形式的维度数据模型。 这些因素使其非常适合迁移到 Azure Synapse。
若要最大程度减少迁移实际 SQL 代码的任务,请遵循以下建议:
数据仓库的初始迁移应按原样进行,以尽量减少风险和花费的时间,即使最后的最终环境将合并不同的数据模型(如数据保管库)也是如此。
考虑在迁移过程中,在 Azure VM 中使用 Teradata 实例进行辅助。
了解 Teradata SQL 实现与 Azure Synapse 之间的差异。
使用现有 Teradata 实现中的元数据和查询日志来评估差异的影响,并规划缓解方法。
尽可能自动执行该过程,以最大程度减少迁移中发生的错误、风险和所用时间。
请考虑使用专业的 Microsoft 合作伙伴和服务来简化迁移。
后续步骤
若要详细了解 Microsoft 和第三方工具,请参阅本系列中的下一篇文章:用于将 Teradata 数据仓库迁移到 Azure Synapse Analytics 的工具。