如何在复制活动中配置 Amazon RDS for SQL Server

本文概述了如何使用数据管道中的复制活动从 Amazon RDS for SQL Server 复制数据。

支持的配置

有关复制活动下每个选项卡的配置,请分别转到以下各部分。

常规

若要配置“常规”设置选项卡,请参阅常规”设置指导。

Source

Amazon RDS for SQL Server 支持复制活动“源”选项卡下的以下属性。

显示“源”选项卡和属性列表的屏幕截图。

需要以下属性:

  • 数据存储类型:选择“外部”。

  • 连接:从连接列表中选择 Amazon RDS for SQL Server 连接。 如果连接不存在,则通过选择“新建”创建新的 Amazon RDS for SQL Server 连接。

  • 连接类型:选择 Amazon RDS for SQL Server

  • 使用查询:指定用于读取数据的方式。 可以选择“表”、“查询”或“存储过程”。 以下列表介绍了每个设置的配置:

    • 表:从指定的表读取数据。 从下拉列表中选择源表,或选择“编辑”以手动输入。

    • 查询:指定使用自定义 SQL 查询读取数据。 示例为 select * from MyTable。 或选择铅笔图标以在代码编辑器中编辑。

      显示查询设置的屏幕截图。

    • 存储过程:使用从源表读取数据的存储过程的名称。 最后一个 SQL 语句必须是存储过程中的 SELECT 语句。

      • 存储过程名称:选中“编辑”框以从源表读取数据时,选择存储过程或手动指定存储过程名称。

      • 存储过程参数:指定存储过程参数的值。 允许的值为名称或值对。 参数的名称和大小写必须与存储过程参数的名称和大小写匹配。 可以选择“导入参数”以获取存储过程参数。

        显示存储过程设置的屏幕截图。

在“高级”下,可以指定以下字段:

  • 查询超时(分钟):指定查询命令执行的超时,默认值为 120 分钟。 如果为此属性设置了参数,则允许的值是时间跨度,例如“02:00:00”(120 分钟)。

  • 隔离级别:指定 SQL 源的事务锁定行为。 允许的值包括:“读取已提交的内容”、“读取未提交的内容”、“可重复读取”、“可序列化”、“快照”。 如果未指定,则使用数据库的默认隔离级别。 有关更多详细信息,请参阅 IsolationLevel Enum

    显示隔离级别设置的屏幕截图。

  • 分区选项:指定用于从 Amazon RDS for SQL Server 加载数据的数据分区选项。 允许的值为:None(默认)、表的物理分区动态范围。 启用分区选项(即,不是“无”)时,从 Amazon RDS for SQL Server 并发加载数据的并行度由复制活动“设置”选项卡中的“复制并行度”控制。

    • None: 选择此设置则不使用分区。

    • 表的物理分区:使用物理分区时,将根据物理表定义自动确定分区列和机制。

    • 动态范围:使用启用了并行的查询时,则需要范围分区参数 (?DfDynamicRangePartitionCondition)。 示例查询:SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition

      • 分区列名称:以整数类型、日期类型或日期/时间类型(intsmallintbigintdatesmalldatetimedatetimedatetime2datetimeoffset)指定源列的名称,范围分区将使用它进行并行复制。 如果未指定,系统会自动检测表的索引或主键并将其用作分区列。

        如果使用查询来检索源数据,请在 WHERE 子句中挂接 ?DfDynamicRangePartitionCondition。 有关示例,请参阅从 SQL 数据库进行并行复制部分。

      • 分区上限:指定分区范围拆分的分区列的最大值。 此值用于决定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 有关示例,请参阅从 SQL 数据库进行并行复制部分。

      • 分区下:指定分区范围拆分的分区列的最小值。 此值用于决定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 有关示例,请参阅从 SQL 数据库进行并行复制部分。

  • 其他列:添加其他数据列以存储源文件的相对路径或静态值。 后者支持表达式。

请注意以下几点:

  • 如果为源指定“查询”,则复制活动针对 Amazon RDS for SQL Server 源运行此查询以获取数据。 也可通过指定“存储过程名称”和“存储过程参数”来指定存储过程,前提是存储过程使用参数
  • 在源中使用存储过程检索数据时,请注意,如果存储过程设计为当传入不同的参数值时返回不同的架构,则从 UI 导入架构或使用自动表创建将数据复制到 SQL 数据库时,可能会遇到故障或出现意外的结果。

映射

对于“映射 ”选项卡配置,请转到“映射”选项卡下的“配置映射”

设置

对于“设置”选项卡配置,请转到“设置”选项卡下的“配置其他设置”

从 SQL 数据库进行并行复制

复制活动中的 Amazon RDS for SQL Server 连接器提供内置的数据分区,用于并行复制数据。 可以在复制活动的“源”表中找到数据分区选项。

启用分区复制时,复制活动将对 Amazon RDS for SQL Server 源运行并行查询,以按分区加载数据。 并行度由复制活动“设置”选项卡中的“复制并行度”控制。例如,如果将“复制并行度”设置为 4,则该服务会根据指定的分区选项和设置并行生成并运行 4 个查询,每个查询从 Amazon RDS for SQL Server 检索一部分数据。

建议同时启用并行复制和数据分区,尤其是从 Amazon RDS for SQL Server 加载大量数据时。 下面是适用于不同方案的建议配置。 将数据复制到基于文件的数据存储中时,建议将数据作为多个文件写入文件夹(仅指定文件夹名称),在这种情况下,性能优于写入单个文件。

方案 建议的设置
从包含物理分区的大型表进行完整加载。 分区选项:表的物理分区。

在执行期间,该服务将自动检测物理分区并按分区复制数据。

若要检查表是否有物理分区,可参考此查询
从不包含物理分区但包含用于数据分区的整数或日期时间列的大型表进行完整加载。 分区选项:动态范围分区。
分区列(可选):指定用于对数据进行分区的列。 如果未指定,将使用主键列。
分区上限和分区下限(可选) :指定是否要确定分区步幅。 这不适用于筛选表中的行,表中的所有行都将进行分区和复制。 如果未指定,则复制活动将自动检测值,这可能需要花费很长时间,具体取决于“最小值”和“最大值”。 建议提供上限和下限。

例如,如果分区列“ID”的值范围为 1 至 100,并且将此值的下限设置为 20、上限设置为 80,并行复制设置为 4,服务将按 4 个分区(分区的 ID 范围分别为 <=20、[21, 50]、[51, 80] 和 >=81)检索数据。
使用自定义查询从不包含物理分区但包含用于数据分区的整数或日期/日期时间列的表加载大量数据。 分区选项:动态范围分区。
查询SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>
分区列:指定用于对数据进行分区的列。
分区上限和分区下限(可选) :指定是否要确定分区步幅。 这不适用于筛选表中的行,查询结果中的所有行都将进行分区和复制。 如果未指定,复制活动会自动检测该值。

例如,如果分区列“ID”的值范围为 1 至 100,并且将此值的下限设置为 20、上限设置为 80,并行复制设置为 4,服务将按 4 个分区(分区的 ID 范围分别为 <=20、[21, 50]、[51, 80] 和 >=81)检索数据。

下面是针对不同场景的更多示例查询:
• 查询整个表:
SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition
• 使用列选择和附加的 where 子句筛选器从表中查询:
SELECT <column_list> FROM <TableName> WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>
• 使用子查询进行查询:
SELECT <column_list> FROM (<your_sub_query>) AS T WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>
• 在子查询中使用分区查询:
SELECT <column_list> FROM (SELECT <your_sub_query_column_list> FROM <TableName> WHERE ?DfDynamicRangePartitionCondition) AS T

使用分区选项加载数据的最佳做法:

  1. 选择独特的列作为分区列(如主键或唯一键),以避免数据倾斜。
  2. 如果表具有内置分区,请使用名为“表的物理分区”分区选项来提升性能。

检查物理分区的示例查询

SELECT DISTINCT s.name AS SchemaName, t.name AS TableName, pf.name AS PartitionFunctionName, c.name AS ColumnName, iif(pf.name is null, 'no', 'yes') AS HasPartition
FROM sys.tables AS t
LEFT JOIN sys.objects AS o ON t.object_id = o.object_id
LEFT JOIN sys.schemas AS s ON o.schema_id = s.schema_id
LEFT JOIN sys.indexes AS i ON t.object_id = i.object_id 
LEFT JOIN sys.index_columns AS ic ON ic.partition_ordinal > 0 AND ic.index_id = i.index_id AND ic.object_id = t.object_id 
LEFT JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id 
LEFT JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id 
LEFT JOIN sys.partition_functions pf ON pf.function_id = ps.function_id 
WHERE s.name='[your schema]' AND t.name = '[your table name]'

如果表具有物理分区,你可看到“HasPartition”为“是”,如下所示。

SQL 查询结果的屏幕截图。

表摘要

有关 Amazon RDS for SQL Server 复制活动的摘要和更多信息,请参阅下表。

源信息

名称 描述 必选 JSON 脚本属性
数据存储类型 你的数据存储类型。 外部 /
Connection 与源数据存储的连接。 < 你的连接 > 连接
连接类型 你的连接类型。 选择 Amazon RDS for SQL Server Amazon RDS for SQL Server /
使用查询 自定义 SQL 查询读取数据。 • 表
• 查询
• 存储过程
/
源数据表。 < 目标表的名称> 架构
查询 自定义 SQL 查询读取数据。 < 你的查询 > sqlReaderQuery
存储过程名称 此属性是从源表读取数据的存储过程的名称。 最后一个 SQL 语句必须是存储过程中的 SELECT 语句。 <存储过程名称> sqlReaderStoredProcedureName
存储过程参数 这些参数用于存储过程。 允许的值为名称或值对。 参数的名称和大小写必须与存储过程参数的名称和大小写匹配。 < 名称或值对 > storedProcedureParameters
查询超时 查询命令执行的超时值。 timespan
(默认值为 120 分钟)
queryTimeout
隔离级别 指定 SQL 源的事务锁定行为。 • 读取已提交的内容
• 读取未提交的内容
• 可重复读取
• 可序列化
• Snapshot
isolationLevel:
• ReadCommitted
• ReadUncommitted
• RepeatableRead
• 可序列化
• Snapshot
分区选项 用于从 Amazon RDS for SQL Server 加载数据的数据分区选项。 •“无”(默认值)
•“表的物理分区”
•“动态范围”
partitionOption:
• 无(默认值)
• PhysicalPartitionsOfTable
• DynamicRange
分区列名称 具有整数类型、日期类型或日期/时间类型intsmallintbigintdatesmalldatetimedatetimedatetime2datetimeoffset)的源列的名称,范围分区将使用它进行并行复制。 如果未指定,系统会自动检测表的索引或主键并将其用作分区列。 如果使用查询来检索源数据,请在 WHERE 子句中挂接 ?DfDynamicRangePartitionCondition < 分区列名称 > partitionColumnName
分区上限 分区范围拆分的分区列的最大值。 此值用于决定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 < 分区上限 > partitionUpperBound
分区下限 分区范围拆分的分区列的最小值。 此值用于决定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 < 分区下限 > partitionLowerBound
其他列 添加其他数据列以存储源文件的相对路径或静态值。 后者支持表达式。 • 姓名
• 值
additionalColumns:
• 名称
• 值