你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Oracle 迁移的设计和性能
本文是一个包含七部分内容的系列的第一部分,该系列提供有关如何从 Oracle 迁移到 Azure Synapse Analytics 的指导。 本文的重点是设计和性能的最佳做法。
概述
由于维护和升级旧版本地 Oracle 环境十分复杂且成本高昂,许多现有 Oracle 用户希望利用新式云环境提供的创新产品。 通过基础结构即服务 (IaaS) 和平台即服务 (PaaS) 云环境,你可以将基础结构维护和平台开发等任务委托给云提供商。
提示
Azure 环境不仅包括数据库,还包括一组全面的功能和工具。
尽管 Oracle 和 Azure Synapse Analytics 都是 SQL 数据库,都使用大规模并行处理 (MPP) 技术在处理超大数据量时实现高查询性能,但二者在方法上存在一些基本差异:
旧版 Oracle 系统通常安装在本地并使用较为昂贵的硬件,而 Azure Synapse 基于云并使用 Azure 存储和计算资源。
升级 Oracle 配置是一项主要任务,涉及额外的物理硬件,且数据库的重新配置或转储和重载可能耗时较长。 由于存储和计算资源在 Azure 环境中是分开的,并且具有弹性缩放功能,因此这些资源可以独立纵向扩展或缩减。
可以根据需要暂停或重设 Azure Synapse 的大小,从而降低资源利用率和成本。
Microsoft Azure 是全球可用的、高度安全且可缩放的云环境,其中包括 Azure Synapse 和一个由支持性工具和功能构成的生态系统。 下图汇总了 Azure Synapse 生态系统。
Azure Synapse 使用 MPP 和自动内存中缓存等技术来提供出色的关系数据库性能。 可以在独立基准中查看这些技术的结果,例如 GigaOm 最近运行的基准,它将 Azure Synapse 与其他常见云数据仓库产品/服务进行了比较。 迁移到 Azure Synapse 环境的客户可获得许多好处,包括:
更优的性能和性价比。
提高了灵活性,缩短了价值实现时间。
更快的服务器部署和应用程序开发。
弹性可伸缩性 - 仅为实际使用量付费。
改进的安全性/合规性。
降低了存储和灾难恢复成本。
更低的整体总拥有成本 (TCO)、更好的成本控制和精简的运营支出 (OPEX)。
为了最大限度地发挥这些优势,请将新的或现有的数据和应用程序迁移到 Azure Synapse 平台。 在许多组织中,迁移包括将现有数据仓库从旧的本地平台(例如 Oracle)移动到 Azure Synapse。 大致来说,迁移过程包括以下步骤:
准备工作 🡆
定义范围 - 要迁移的内容。
生成用于迁移的数据和进程的清单。
定义数据模型更改(如果有)。
定义源数据提取机制。
确定要使用的适当的 Azure 和第三方工具及功能。
尽早在新平台上培训员工。
设置 Azure 目标平台。
迁移 🡆
从小规模开始。
尽可能自动化。
利用 Azure 内置工具和功能来减少迁移工作量。
迁移表和视图的元数据。
迁移要维护的历史数据。
迁移或重构存储过程和业务流程。
迁移或重构 ETL/ELT 增量加载流程。
迁移后
监视和记录进程的所有阶段。
使用获得的经验为未来的迁移生成模板。
根据需要,重新设计数据模型(使用新的平台性能和可伸缩性)。
测试应用程序和查询工具。
基准和优化查询性能。
本文提供关于在将数据仓库从现有 Oracle 环境迁移到 Azure Synapse 时优化性能的一般信息和指南。 性能优化的目标是迁移后可在 Azure Synapse 中实现同等或更好的数据仓库性能。
设计注意事项
迁移范围
准备从 Oracle 环境迁移时,请考虑以下迁移选择。
选择初始迁移的工作负载
通常,旧版的 Oracle 环境随着时间的推移而发展,涵盖多个主题领域和混合工作负载。 决定开始迁移项目的位置时,请选择一个可以执行以下操作的区域:
通过快速提供新环境的优势,证明迁移到 Azure Synapse 的可行性。
内部技术人员可以获得在迁移其他领域时使用的流程和工具的相关经验。
为进一步的迁移创建模板,该模板需特定于源 Oracle 环境以及当前已有的工具和流程。
适合从 Oracle 环境进行初始迁移的区域除了支持上述事项以外,还应:
实现 BI/Analytics 工作负载而不是联机事务处理 (OLTP) 工作负载。
具有数据模型(如星型或雪花型架构),只需最少的修改即可迁移。
提示
创建需要迁移的对象清单,并记录迁移过程。
初始迁移中的迁移数据量应该足够大,能够展示 Azure Synapse 环境的功能和优势,但又不能太大而无法快速展示价值。 大小范围通常介于 1-10 TB 之间。
最初迁移项目时应最大程度地降低风险、减少所需的工作量和时间,以便快速了解 Azure 云环境的优势。 以下方法都将初始迁移的范围限制为仅数据市场,且均不涉及更广层面上的迁移(例如 ETL 迁移和历史数据迁移)。 但是,只要数据和所需的生成过程回填了迁移的数据市场层,即可在项目的后期阶段解决这些问题。
直接迁移与分阶段方法
通常,无论计划迁移的目的和范围如何,都有两种类型的迁移:直接迁移以及包含更改的分阶段方法。
直接迁移
在直接迁移中,现有数据模型(如星型架构)将按原样迁移到新的 Azure Synapse 平台。 此方法通过减少实现迁移到 Azure 云环境的优势所需的工作,将风险和迁移时间降到最低。 直接迁移非常适合以下情况:
- 具有现成的 Oracle 环境,其中包含单个要迁移的数据市场,或者
- 具有现成的 Oracle 环境,其中的数据已具备精心设计的星型或雪花型架构,或者
- 面临着迁移到新式云环境的时间和成本压力。
提示
直接迁移是一个很好的起点,即使后续阶段实现了对数据模型的更改也是如此。
包含更改的分阶段方法
如果旧的数据仓库已经发展了很长时间,可能需要对其进行重新设计,从而维持所需的性能级别。 可能还需要重新设计以支持物联网 (IoT) 流等新数据。 作为重新设计过程的一部分,迁移到 Azure Synapse 能获得可缩放云环境的好处。 迁移可包含基础数据模型中的更改(例如从 Inmon 模型迁移到数据保管库)。
Microsoft 建议将现有数据模型按原样移动到 Azure,并使用 Azure 环境的性能和灵活性来应用重新设计的更改。 这样,可以使用 Azure 的功能进行更改,而不会影响现有的源系统。
使用 Microsoft 设施实现元数据驱动的迁移
可以使用 Azure 环境的功能来自动执行和协调迁移进程。 此方法将对现有 Oracle 环境的性能影响降至最低,尤其是在该环境已接近运行容量上限时。
适用于 Oracle 的 SQL Server 迁移助手 (SSMA) 可以自动执行迁移过程的许多部分,某些情况下包括函数和程序代码迁移。 SSMA 支持将 Azure Synapse 作为目标环境。
SSMA for Oracle 有助于将 Oracle 数据仓库或数据市场迁移到 Azure Synapse。 SSMA 旨在自动完成从现有 Oracle 环境迁移表、视图和数据的过程。
Azure 数据工厂是一种基于云的数据集成服务,支持在云中创建数据驱动的工作流,以协调和自动执行数据移动和数据转换。 可以使用数据工厂创建和计划数据驱动工作流(管道),这些工作流从不同的数据存储中引入数据。 数据工厂可使用如 Azure HDInsight Hadoop、Spark、Azure Data Lake Analytics 和 Azure 机器学习等计算服务处理和转换数据。
数据工厂可用于将数据从源迁移到 Azure SQL 目标。 这种脱机数据移动有助于显著减少迁移故障时间。
Azure 数据库迁移服务可帮助规划和执行从 Oracle 等环境进行的迁移。
如果计划使用 Azure 设施来管理迁移进程,请创建列出所有要迁移的数据表及其位置的元数据。
Oracle 与 Azure Synapse 之间的设计差异
如前所述,Oracle 数据库与 Azure Synapse Analytics 数据库在方法上存在一些基本差异。 适用于 Oracle 的 SSMA 不仅有助于消除这些差异,而且还可自动执行迁移。 尽管 SSMA 不是处理量非常大的数据的最有效方法,但它对于较小的表很有用。
多个数据库与单一数据库和架构
Oracle 环境通常包含多个单独的数据库。 例如,可能有单独的数据库用于:数据引入和临时表、核心仓库表和数据市场(有时称为语义层)。 如果在 ETL 或 ELT 管道中处理,可实现跨数据库联接,并在单独的数据库之间移动数据。
相反,Azure Synapse 环境包含单一数据库,并使用架构将表划分为逻辑上独立的组。 建议在目标 Azure Synapse 数据库中使用一系列架构来模拟从 Oracle 环境迁移的单独数据库。 如果 Oracle 环境已使用架构,在将现有 Oracle 表和视图移动到新环境时可能需要使用新的命名约定。 例如,可以将现有的 Oracle 架构和表名连接到新的 Azure Synapse 表名中,然后使用新环境中的架构名来维护原始的单独数据库名。 尽管可以使用基础表上的 SQL 视图来维护逻辑结构,但此方法也有潜在的缺点:
Azure Synapse 中的视图是只读的,因此必须在基础基表上对数据进行任何更新。
可能已经存在一个或多个视图层,添加额外的视图层可能会影响性能。
提示
在 Azure Synapse 中将多个数据库合并到单一数据库,并使用架构名在逻辑上分隔表。
表注意事项
在不同环境之间迁移表时,通常只有原始数据和描述它的元数据进行物理迁移。 源系统中的其他数据库元素(例如索引)通常不会迁移,因为在新环境中它们可能是不必要的,或者实现方式不同。
源环境中的性能优化(例如索引)体现了可以在新环境中添加性能优化的位置。 例如,如果源 Oracle 环境中的查询经常使用位图索引,则表明应在 Azure Synapse 中创建非聚集索引。 表复制等其他原生性能优化技术可能比直接创建同类索引更适用。 适用于 Oracle 的 SSMA 可用于提供针对表分布和索引的迁移建议。
提示
现有索引指示已迁移的仓库中的候选索引。
不支持的 Oracle 数据库对象类型
通常可以使用 Azure Synapse 功能替换特定于 Oracle 的功能。 但 Azure Synapse 不直接支持某些 Oracle 数据库对象。 以下不受支持的 Oracle 数据库对象列表说明了如何在 Azure Synapse 中实现等效功能。
各种索引选项:Oracle 中的多个索引选项(如位图索引、基于函数的索引和域索引)在 Azure Synapse 中没有直接等效项。
可通过以下方式找出哪些列已编制索引以及索引类型:
查询系统目录表和视图,例如
ALL_INDEXES
、DBA_INDEXES
、USER_INDEXES
和DBA_IND_COL
。 可以使用 Oracle SQL Developer 中的内置查询,如以下屏幕截图所示。或者,运行以下查询,查找给定类型的所有索引:
SELECT * FROM dba_indexes WHERE index_type LIKE 'FUNCTION-BASED%';
查询
dba_index_usage
或v$object_usage
视图(若启用监视)。 可以在 Oracle SQL Developer 中查询这些视图,如以下屏幕截图所示。
基于函数的索引(其中索引包含基础数据列上的函数结果)在 Azure Synapse 中没有直接等效项。 建议先迁移数据,然后在 Azure Synapse 中运行 Oracle 查询(查询使用基于函数的索引来衡量性能)。 如果无法接受 Azure Synapse 中这些查询的性能,请考虑创建包含预先计算好的值的列,然后为该列编制索引。
配置 Azure Synapse 环境时,只实现正在使用的索引才有意义。 Azure Synapse 当前支持此处所示的索引类型:
借助 Azure Synapse 功能(例如并行查询处理以及数据和结果的内存中缓存),数据仓库应用程序可能只需更少的索引就能实现性能目标。 建议在 Azure Synapse 使用以下索引类型:
聚集列存储索引:如果未为表指定索引选项,Azure Synapse 将默认创建聚集列存储索引。 聚集列存储表提供最高级别的数据压缩、最佳整体查询性能,并且通常优于聚集索引表或堆表。 聚集列存储索引通常是大型表的最佳选择。 创建表时,如果不确定如何为表编制索引,那就选择聚集列存储。 但针对某些情况,聚集列存储索引并非最佳选择:
- 在排序键上具有预排序数据的表可以受益于有序聚集列存储索引支持的段消除。
- 具有 varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型的表,因为聚集列存储索引不支持这些数据类型。 请转而考虑使用堆或聚集索引。
- 具有暂时数据的表,因为列存储表的效率可能低于堆表或临时表。
- 包含少于 1 亿行的小型表。 请转而考虑使用堆表。
有序聚集列存储索引:通过启用高效的段消除,Azure Synapse 专用 SQL 池中的有序聚集列存储索引通过跳过与查询谓词不匹配的大量有序数据来提供更快的性能。 由于需要执行数据排序操作,将数据载入有序 CCI 表所需的时间可能比载入无序 CCI 表更长,但之后,查询可以使用有序 CCI 更快地运行。 有关有序聚集列存储索引的详细信息,请参阅使用有序聚集列存储索引优化性能。
聚集索引和非聚集索引:如果需要快速检索单个行,聚集索引可能优于聚集列存储索引。 对于必须以极快的速度执行单行查找或仅执行几行查找的查询,请考虑使用聚集索引或非聚集辅助索引。 使用聚集索引的缺点在于,只有在聚集索引列上使用高度可选筛选器的查询才可受益。 若要改进对其他列的筛选,可将非聚集索引添加到其他列。 但是,添加到表的每个索引将使用更多空间,并增加加载的处理时间。
堆表:如果要将数据临时移入 Azure Synapse,你可能会发现使用堆表可以加快整个过程。 这是因为将数据加载到堆表的速度比将数据加载到索引表更快,在某些情况下,还可从缓存中完成后续读取。 如果加载数据只是为了在运行更多转换之前进行暂存,则将其加载到堆表要远快于将其加载到聚集列存储表。 此外,将数据载入临时表也比将表载入永久存储更快。 对于少于 1 亿行的小型查找表,堆表通常是正确的选择。 如果表的行数超过 1 亿,聚集列存储表将开始表现出最佳压缩性能。
聚集表:可以组织 Oracle 表,以便将经常一起访问的表行(基于一个公用值)以物理方式存储在一起,从而减少检索数据时的磁盘 I/O。 Oracle 还提供针对单个表的哈希群集选项,该选项将哈希值应用于群集键,然后将具有相同哈希值的行以物理方式存储到一起。 若要列出 Oracle 数据库中的群集,请使用
SELECT * FROM DBA_CLUSTERS;
查询。 若要确定表是否在群集中,请使用SELECT * FROM TAB;
查询,此查询可显示每个表的表名称和群集 ID。在 Azure Synapse 中,可以使用具体化表和/或复制表来取得类似的结果,因为这些表类型可将查询运行时所需的 I/O 降至最低。
具体化视图:Oracle 支持具体化视图。对于具有许多列的大型表,如果在查询中经常只用到少数列,则建议使用一个或多个具体化视图。 更新基表中的数据时,系统会自动刷新具体化视图。
2019 年,Microsoft 宣布 Azure Synapse 将支持具体化视图,功能与在 Oracle 中相同。 具体化视图目前在 Azure Synapse 中是预览功能。
数据库内触发器:在 Oracle 中,触发器可以配置为在发生触发事件时自动运行。 触发事件可以是:
数据操作语言 (DML) 语句(例如
INSERT
、UPDATE
或DELETE
)在表上运行。 如果定义了一个在客户表上的INSERT
语句之前触发的触发器,则它将在新行插入到客户表之前触发一次。DDL 语句(例如
CREATE
或ALTER
)运行。 此触发器通常用于审核,可记录架构更改。系统事件,例如 Oracle 数据库的启动或关闭。
用户事件,例如登录或退出登录。
可通过查询
ALL_TRIGGERS
、DBA_TRIGGERS
或USER_TRIGGERS
视图来获取 Oracle 数据库中定义的触发器列表。 以下屏幕截图显示了 Oracle SQL Developer 中的DBA_TRIGGERS
查询。Azure Synapse 不支持 Oracle 数据库触发器。 但你可以使用数据工厂添加等效功能,不过这样做需要重构使用触发器的进程。
同义词:Oracle 支持定义同义词,以用作多个数据库对象类型的别名。 这些对象类型包括:表、视图、序列、过程、存储函数、包、具体化视图、Java 类架构对象、用户定义的对象或其他同义词。
Azure Synapse 目前不支持定义同义词,但如果 Oracle 中的同义词指代某个表或视图,则可以在 Azure Synapse 中定义视图以匹配别名。 如果 Oracle 中的同义词指代某个函数或存储过程,则可以在 Azure Synapse 中另外创建一个调用目标的函数或存储过程,其名称应与同义词匹配。
用户定义的类型:Oracle 支持用户定义的对象,这些对象可以包含一系列单独的字段,每个字段都有其自己的定义和默认值。 可使用与内置数据类型(如
NUMBER
或VARCHAR
)相同的方式在表定义中引用这些对象。 可通过查询ALL_TYPES
、DBA_TYPES
或USER_TYPES
视图来获取 Oracle 数据库中用户定义的类型列表。Azure Synapse 当前不支持用户定义的类型。 如果需要迁移的数据包括用户定义的数据类型,请将其“平展”为常规的表定义;如果它们是数据数组,请在单独的表中对其进行规范化处理。
Oracle 数据类型映射
大多数 Oracle 数据类型在 Azure Synapse 中都有直接的等效项。 下表显示了将 Oracle 数据类型映射到 Azure Synapse 的推荐方法。
Oracle 数据类型 | Azure Synapse 数据类型 |
---|---|
BFILE | 不支持。 映射到 VARBINARY (MAX)。 |
BINARY_FLOAT | 不支持。 映射到 FLOAT。 |
BINARY_DOUBLE | 不支持。 映射到 DOUBLE。 |
BLOB | 不直接支持。 替换为 VARBINARY(MAX)。 |
CHAR | CHAR |
CLOB | 不直接支持。 替换为 VARCHAR(MAX)。 |
DATE | Oracle 中的 DATE 还可以包含时间信息。 根据使用情况映射到 DATE 或 TIMESTAMP。 |
DECIMAL | DECIMAL |
DOUBLE | PRECISION DOUBLE |
FLOAT | FLOAT |
INTEGER | INT |
INTERVAL YEAR TO MONTH | INTERVAL 数据类型不受支持。 使用日期比较函数(如 DATEDIFF 或 DATEADD)进行日期计算。 |
INTERVAL DAY TO SECOND | INTERVAL 数据类型不受支持。 使用日期比较函数(如 DATEDIFF 或 DATEADD)进行日期计算。 |
LONG | 不支持。 映射到 VARCHAR(MAX)。 |
LONG RAW | 不支持。 映射到 VARBINARY(MAX)。 |
NCHAR | NCHAR |
NVARCHAR2 | NVARCHAR |
NUMBER | FLOAT |
NCLOB | 不直接支持。 替换为 NVARCHAR(MAX)。 |
NUMERIC | NUMERIC |
ORD 媒体数据类型 | 不支持 |
RAW | 不支持。 映射到 VARBINARY。 |
REAL | REAL |
ROWID | 不支持。 类似地,映射到 GUID。 |
SDO 地理空间数据类型 | 不支持 |
SMALLINT | SMALLINT |
TIMESTAMP | DATETIME2 或 CURRENT_TIMESTAMP() 函数 |
TIMESTAMP WITH LOCAL TIME ZONE | 不支持。 映射到 DATETIMEOFFSET。 |
TIMESTAMP WITH TIME ZONE | 不支持,因为 TIME 使用时钟时间存储,而无时区偏移量。 |
URIType | 不支持。 存储在 VARCHAR 中。 |
UROWID | 不支持。 类似地,映射到 GUID。 |
VARCHAR | VARCHAR |
VARCHAR2 | VARCHAR |
XMLType | 不支持。 在 VARCHAR 中存储 XML 数据。 |
Oracle 还支持定义用户定义的对象,这些对象可以包含一系列单独的字段,每个字段都有自己的定义和默认值。 然后,可使用与内置数据类型(如 NUMBER
或 VARCHAR
)相同的方式在表定义中引用这些对象。 Azure Synapse 当前不支持用户定义的类型。 如果需要迁移的数据包括用户定义的数据类型,请将其“平展”为常规的表定义;如果它们是数据数组,请在单独的表中对其进行规范化处理。
提示
在迁移准备阶段评估不受支持数据类型的数量和类型。
第三方供应商提供工具和服务来自动迁移,包括数据类型的映射。 如果已在 Oracle 环境中使用第三方 ETL 工具,请使用该工具来实现任何所需的数据转换。
SQL DML 语法差异
Oracle SQL 和 Azure Synapse T-SQL 之间存在 SQL DML 语法差异。 最大程度减少 Oracle 迁移中的 SQL 问题中详细讨论了这些差异。 在某些情况下,可使用 Microsoft 工具(如适用于 Oracle 的 SSMA 和 Azure 数据库迁移服务)或第三方迁移产品和服务来自动执行 DML 迁移。
函数、存储过程和序列
从 Oracle 等成熟环境迁移数据仓库时,可能需要迁移简单表和视图以外的元素。 检查 Azure 环境中的工具是否可以替换函数、存储过程和序列等功能,因为使用内置 Azure 工具通常比为 Azure Synapse 重新编码它们更高效。
作为准备阶段的一部分,请创建需要迁移的对象清单,定义处理它们的方法,并在迁移计划中分配适当的资源。
Microsoft 工具(如适用于 Oracle 的 SSMA 和 Azure 数据库迁移服务)或第三方迁移产品和服务可以自动执行函数、存储过程和序列的迁移。
以下部分进一步讨论函数、存储过程和序列的迁移。
函数
与大多数数据库产品一样,Oracle 在 SQL 实现中支持系统和用户定义的函数。 将旧数据库平台迁移到 Azure Synapse 时,常见系统函数通常无需更改即可迁移。 某些系统函数的语法可能略有不同,但任何所需的更改可自动执行。 可以通过使用适当的 WHERE
子句查询 ALL_OBJECTS
视图来获取 Oracle 数据库中的函数列表。 可以使用 Oracle SQL Developer 获取函数列表,如以下屏幕截图所示。
对于在 Azure Synapse 中没有等效函数的 Oracle 系统函数或任意的用户定义的函数,请使用目标环境语言重新编码这些函数。 Oracle 用户定义函数采用 PL/SQL、Java 或 C 进行编码。Azure Synapse 使用 Transact-SQL 语言来实现用户定义的函数。
存储过程
大多数新式数据库产品都支持在数据库中存储过程。 为此,Oracle 提供了 PL/SQL 语言。 存储过程通常包含 SQL 语句和过程逻辑,并返回数据或状态。 可以通过使用适当的 WHERE
子句查询 ALL_OBJECTS
视图来获取 Oracle 数据库中的存储过程列表。 可以使用 Oracle SQL Developer 获取存储过程列表,如以下屏幕截图所示。
Azure Synapse 支持使用 T-SQL 的存储过程,因此需要使用该语言重新编码任何迁移的存储过程。
序列
在 Oracle 中,序列是使用 CREATE SEQUENCE
创建的命名数据库对象。 序列通过 CURRVAL
和 NEXTVAL
方法提供唯一的数值。 可以使用生成的唯一编号作为主键的代理键值。
Azure Synapse 未实现 CREATE SEQUENCE
,但你可以使用 IDENTITY 列或 SQL 代码来实现序列,以生成系列中的下一个序列号。
从 Oracle 环境提取元数据和数据
数据定义语言生成
ANSI SQL 标准定义了数据定义语言 (DDL) 命令的基本语法。 某些 DDL 命令(例如 CREATE TABLE
和 CREATE VIEW
)在 Oracle 和 Azure Synapse 中都很常见,但这些命令也提供特定于实现的功能,例如索引、表分布和分区选项。
可以编辑现有的 Oracle CREATE TABLE
和 CREATE VIEW
脚本,用于在 Azure Synapse 中实现等效定义。 为此,可能需要使用修改后的数据类型,并移除或修改特定于 Oracle 的子句,例如 TABLESPACE
。
在 Oracle 环境中,系统目录表指定当前表和视图定义。 与用户维护的文档不同,系统目录信息始终是完整的并与当前表定义同步。 可以使用 Oracle SQL Developer 等实用工具访问系统目录信息。 Oracle SQL Developer 可生成 CREATE TABLE
DDL 语句,你可编辑这些语句,以便在 Azure Synapse 中创建等效表。
或者,可以使用适用于 Oracle 的 SSMA 将表从现有 Oracle 环境迁移到 Azure Synapse。 适用于 Oracle 的 SSMA 将应用适当的数据类型映射和建议的表和分布类型,如以下屏幕截图所示。
还可以使用处理系统目录信息的第三方迁移和 ETL 工具来实现类似结果。
从 Oracle 提取数据
可以使用标准 Oracle 实用工具(如 Oracle SQL Developer、SQL*Plus 和 SCLcl)将原始表数据从 Oracle 表提取到带分隔符的平面文件(如 CSV 文件)。 然后,可以使用 gzip 压缩带分隔符的平面文件,并使用 AzCopy 或 Azure Data Box 等 Azure 数据传输工具将压缩文件上传到 Azure Blob 存储。
尽可能高效地提取表数据,尤其是在迁移大型事实数据表时。 对于 Oracle 表,请使用并行将提取吞吐量最大化。 可通过运行多个单独提取离散数据段的进程,或使用能够通过分区自动执行并行提取的工具来实现并行。
提示
使用并行来实现最有效的数据提取。
如果有充足的网络带宽,可以将数据从本地 Oracle 系统直接提取到 Azure Synapse 表或 Azure Blob 数据存储中。 为此,请使用数据工厂进程、Azure 数据库迁移服务或第三方数据迁移或 ETL 产品。
提取的数据文件应包含 CSV、优化行纵栏表 (ORC) 或 Parquet 格式的带分隔符的文本。
若要详细了解如何从 Oracle 环境迁移数据和 ETL,请参阅 Oracle 迁移的数据迁移、ETL 和加载。
有关 Oracle 迁移的性能建议
性能优化的目标是:迁移到 Azure Synapse 后,数据仓库性能未变或更好。
性能优化方法概念的相似性
Oracle 数据库的许多性能优化概念同样适用于 Azure Synapse 数据库。 例如:
使用数据分发将要联接的数据并置在同一处理节点上。
对给定列使用最小数据类型可节省存储空间,并加速查询处理。
确保要联接的列具有同一数据类型,以便优化联接处理并减少对数据转换的需求。
为了帮助优化器生成最佳执行计划,请确保统计信息是最新的。
使用内置数据库功能监视性能可确保有效使用资源。
提示
在迁移开始时,优先熟悉 Azure Synapse 优化选项。
性能优化方法的差异
此部分重点介绍 Oracle 和 Azure Synapse 之间的低级别性能优化实现差异。
数据分发选项
在性能方面,Azure Synapse 采用多节点体系结构设计并使用并行处理。 若要优化 Azure Synapse 中的表性能,可以使用 DISTRIBUTION
语句在 CREATE TABLE
语句中定义数据分布选项。 例如,可以指定哈希分布表,该表使用确定性哈希函数跨计算节点分布表行。 许多 Oracle 实现(尤其是较旧的本地系统)不支持此功能。
与 Oracle 不同,Azure Synapse 支持通过小型表复制在小型表和大型表之间进行本地联接。 例如,考虑星型架构模型中的小型维度表和大型事实数据表。 Azure Synapse 可以跨所有节点复制较小的维度表,以确保大型表的任何联接键的值都具有匹配的本地可用的维度行。 对于小型维度表,维度表复制的开销相对较低。 对于大型维度表,哈希分布方法更适用。 有关数据分发选项的详细信息,请参阅有关使用复制表的设计指南和有关设计分布式表的指南。
提示
哈希分布改进了大型事实数据表的查询性能。 轮循机制分布可用于提高加载速度。
可以对多列应用哈希分布,以便更均匀地分布基表。 利用多列分布,最多可以选择八列进行分布。 这不仅减少了一段时间内的数据倾斜,还提高了查询性能。
注意
对于 Azure Synapse Analytics,多列分步功能目前以预览版提供。 可以将多列分布与 CREATE MATERIALIZED VIEW、CREATE TABLE 和 CREATE TABLE AS SELECT 一起使用。
分发顾问
在 Azure Synapse SQL 中,可以自定义每个表的分布方式。 表分布策略会极大地影响查询性能。
分布顾问是 Synapse SQL 中的一项新功能,可分析查询并推荐表的最佳分布策略以提高查询性能。 顾问考虑的查询可由你提供,也可以从 DMV 中提供的历史查询拉取。
有关如何使用分布顾问的详细信息和示例,请访问 Azure Synapse SQL 中的分布顾问。
数据索引
Azure Synapse 支持多个用户可定义的索引选项,与 Oracle 中的系统托管区域映射相比,这些选项具有不同的操作和用法。 有关 Azure Synapse 中不同索引选项的详细信息,请参阅专用 SQL 池表上的索引。
源 Oracle 环境中的索引定义提供了数据使用情况的有用指示和 Azure Synapse 环境中用于索引的候选列。 通常,无需从旧 Oracle 环境迁移每个索引,因为 Azure Synapse 并不过度依赖索引,而是实现以下功能来达到极佳的性能:
并行查询处理。
内存中数据和结果集缓存。
数据分布(例如复制小型维度表),可减少 I/O。
数据分区
在企业数据仓库中,事实数据表可以包含数十亿行。 分区可将这些表拆分成单独的部分来减少处理的数据量,从而优化这些表的维护和查询。 在 Azure Synapse 中,CREATE TABLE
语句定义表的分区规范。
每个表只能使用一个字段进行分区。 通常是日期字段,因为许多查询按日期或日期范围进行筛选。 可以在初始加载后更改表的分区,方法是使用 CREATE TABLE AS
(CTAS) 语句重新创建具有新分布的表。 有关 Azure Synapse 中分区的详细讨论,请参阅专用 SQL 池中的分区表。
用于数据加载的 PolyBase 或 COPY INTO
PolyBase 使用并行加载流来支持将大量数据高效加载到数据仓库。 有关详细信息,请参阅 PolyBase 数据加载策略。
COPY INTO 也支持高吞吐量数据引入及:
- 从文件夹和子文件夹中的所有文件中检索数据。
- 从同一存储帐户中的多个位置检索数据。 可以使用逗号分隔的路径指定多个位置。
- Azure Data Lake Storage (ADLS) 和 Azure Blob 存储。
- CSV、PARQUET 和 ORC 文件格式。
提示
推荐的数据加载方法是使用 COPY INTO
和 PARQUET 文件格式。
工作负荷管理
运行混合工作负荷会给繁忙的系统带来资源挑战。 成功的工作负载管理方案能够有效地管理资源,确保高效的资源利用,并将投资回报率 (ROI) 最大化。 工作负载分类、工作负荷重要性和工作负荷隔离可以更好地控制工作负荷利用系统资源的方式。
工作负荷管理指南介绍了用于分析工作负荷、管理和监视工作负荷重要性的技术,以及将资源类转换为工作负载组的步骤。 使用 Azure 门户和 DMV 上的 T-SQL 查询来监视工作负载,确保有效利用适用的资源。
后续步骤
若要了解 Oracle 迁移的 ETL 和加载,请参阅本系列中的下一篇文章:Oracle 迁移的数据迁移、ETL 和加载。