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 数据类型
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 代码来实现序列,以生成系列中的下一个序列号。
数据定义语言生成
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 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 和加载。
性能优化的目标是:迁移到 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 和加载。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback。
提交和查看相关反馈