本文概述了如何使用管道中的复制活动从 SQL 数据库复制数据。
支持的配置
有关复制活动下每个选项卡的配置,请分别转到以下部分。
概况
请参阅 常规 设置 指南,以配置 常规 设置选项卡。
来源
复制活动的 “源 ”选项卡下的 SQL 数据库支持以下属性。
需要以下属性:
连接:选择引用本文中的步骤的现有 SQL 数据库。
使用查询:可以选择 表、 查询或 存储过程。 以下列表描述了每个设置的配置:
在“高级”下,可以指定以下字段:
查询超时(分钟):指定查询命令执行的超时,默认值为 120 分钟。 如果为此属性设置了参数,则允许的值是时间跨度,例如“02:00:00”(120 分钟)。
隔离级别:指定 SQL 源的事务锁定行为。 允许的值包括: 读取已提交、 读取未提交、 可重复读取、 可序列化或 快照。 有关更多详细信息,请参阅 IsolationLevel 枚举 。
分区选项:指定用于从 SQL 数据库加载数据的数据分区选项。 允许的值为: 无 (默认值)、 表的物理分区和 动态范围。 启用分区选项(即非 None)时,从 SQL 数据库并发加载数据的并行度由复制活动设置选项卡中的 复制并行度 控制。
无:选择此设置以不使用分区。
表的物理分区:使用物理分区时,将根据物理表定义自动确定分区列和机制。
动态范围:使用启用了并行的查询时,需要范围分区参数(
?DfDynamicRangePartitionCondition)。 示例查询:SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition.分区列名称:以整数或日期/日期时间类型(
int、smallint、bigint、date、smalldatetime、datetime、datetime2或datetimeoffset)指定用于范围分区并进行并行复制的源列名称。 如果未指定,则会自动检测表的索引或主键,并将其用作分区列。如果使用查询来检索源数据,请在 WHERE 子句中挂接
?DfDynamicRangePartitionCondition。 有关示例,请参阅从 SQL 数据库进行并行复制部分。分区上限:指定分区范围拆分的分区列的最大值。 此值用于确定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 有关示例,请参阅从 SQL 数据库进行并行复制部分。
分区下限:指定分区范围拆分的分区列的最小值。 此值用于确定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 有关示例,请参阅从 SQL 数据库进行并行复制部分。
其他列:添加更多数据列以存储源文件的相对路径或静态值。 后者支持表达式。 有关详细信息,请转到 在复制过程中添加其他列。
目的地
复制活动的 “目标 ”选项卡下的 SQL 数据库支持以下属性。
需要以下属性:
连接:选择引用本文中的步骤的现有 SQL 数据库。
表选项:从 “使用现有 表”或 “自动创建”表中进行选择。
如果选择 “使用现有项”:
- 表:指定要写入数据的 SQL 数据库的名称。 从下拉列表中选择现有表,或 手动选择 Enter 以输入架构和表名称。
如果选择“ 自动创建表”:
- 表:它在源架构中自动创建表(如果不存在),在存储过程用作写入行为时不受支持。
在“高级”下,可以指定以下字段:
写入行为:定义源文件来自基于文件的数据存储时的写入行为。 可以选择“插入”、“Upsert”或“存储过程”。
插入:如果源数据已插入,请选择此选项。
Upsert:如果源数据同时插入和更新,请选择此选项。
使用 TempDB:指定是否使用全局临时表或物理表作为插入或更新的中间表。 默认情况下,服务使用全局临时表作为临时表,并选中此复选框。
如果将大量数据写入 SQL 数据库,请取消选中此项并指定一个架构名称,在该名称下,数据工厂将创建一个临时表来加载上游数据并在完成后自动清理。 确保用户已在数据库中创建表权限,并更改对架构的权限。 如果未指定,全局临时表将用作暂存表。选择用户数据库架构:如果未选择 “使用 TempDB ”,请指定一个架构名称,在该名称下,数据工厂将创建一个临时表来加载上游数据,并在完成后自动清理它们。 请确保已在数据库中创建表权限,并更改对架构的权限。
注释
必须具有创建和删除表的权限。 默认情况下,临时表将共享与目标表相同的架构。
键列:选择用于确定源中的行是否与目标中的行匹配的列。
存储过程名称:从下拉列表中选择存储过程。
批量插入表锁:选择是或否。 使用此设置可在无索引的表上进行来自多个客户端的大批量插入操作时提高复制性能。 有关详细信息,请转到 BULK INSERT (Transact-SQL)
预复制脚本:指定在每次运行中将数据写入目标表之前要执行的复制活动的脚本。 可以使用此属性清除预加载的数据。
写入批处理超时:指定批处理插入操作在超时之前完成的等待时间。允许的值为时间跨度。 默认值为“00:30:00”(30 分钟)。
写入批大小:指定要插入到每个批的 SQL 表中的行数。 允许的值为整数(行数)。 默认情况下,该服务根据行大小动态确定适当的批大小。
最大并发连接数:指定活动运行期间与数据存储建立的并发连接的上限。 仅当想要限制并发连接时,才指定一个值。
映射
对于Mapping选项卡的配置,如果不应用具有自动创建表功能作为目标的SQL数据库,请转到Mapping。
如果您将具有自动创建表功能的 SQL 数据库作为目标,除了 映射中的配置之外,您还可以编辑目标列的类型。 选择 “导入架构”后,可以在目标中指定列类型。
例如,源中 ID 列的类型为 int,当映射到目标列时,你可以将其更改为浮动类型。
设置
对于“设置”选项卡配置,请转到“设置”选项卡下的“配置其他设置”。
从 SQL 数据库进行并行复制
复制活动中的 SQL 数据库连接器提供内置的数据分区来并行复制数据。 可以在复制活动的“源”表中找到数据分区选项。
启用分区复制时,复制活动会针对 SQL 数据库源运行并行查询,以便按分区加载数据。 并行度由复制活动设置选项卡中 的复制并行度 控制。例如,如果将 复制并行度 设置为 4,服务会根据指定的分区选项和设置同时生成并运行四个查询,并且每个查询从 SQL 数据库检索一部分数据。
建议使用数据分区启用并行复制,尤其是在从 SQL 数据库加载大量数据时。 下面是适用于不同方案的建议配置。 将数据复制到基于文件的数据存储中时,建议将数据作为多个文件写入文件夹(仅指定文件夹名称),在这种情况下,性能优于写入单个文件。
| Scenario | 建议的设置 |
|---|---|
| 从包含物理分区的大型表进行完整加载。 |
分区选项:表的物理分区。 在执行期间,该服务将自动检测物理分区并按分区复制数据。 若要检查表是否有物理分区,可参考此查询。 |
| 从不包含物理分区但包含用于数据分区的整数或日期时间列的大型表进行完整加载。 |
分区选项:动态范围分区。 分区列(可选):指定用于对数据进行分区的列。 如果未指定,将使用索引或主键列。 分区上限和分区下限(可选) :指定是否要确定分区步幅。 这不适用于筛选表中的行,表中的所有行都将进行分区和复制。 如果未指定,复制活动会自动检测值,并且可能需要很长时间,具体取决于 MIN 和 MAX 值。 建议提供上限和下限。 例如,如果分区列“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 |
使用分区选项加载数据的最佳做法:
- 选择独特的列作为分区列(如主键或唯一键),以避免数据倾斜。
- 如果表具有内置分区,请使用 表的物理分区 分区选项以获得更好的性能。
检查物理分区的示例查询
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 数据库中复制活动的详细信息。
来源
| Name | Description | 价值 | 必选 | JSON 脚本属性 |
|---|---|---|---|---|
| 连接 | 与源数据存储的连接。 | <连接> | 是的 | 连接 |
| 使用查询 | 读取数据的方式。 应用 表 以从指定表读取数据,或使用 SQL 查询将 查询 应用于读取数据。 | • 表 • 查询 • 存储过程 |
是的 | / |
| 对于 表 | ||||
| 架构名称 | 架构的名称。 | < 架构名称 > | 否 | 架构 |
| 表名称 | 表格名称 | < 表名称 > | 否 | 表 |
| 对于 查询 | ||||
| 查询 | 指定要读取数据的自定义 SQL 查询。 例如: SELECT * FROM MyTable。 |
< SQL 查询 > | 否 | sqlReaderQuery |
| 对于 存储过程 | ||||
| 存储过程名称 | 存储过程的名称。 | < 存储过程名称 > | 否 | sqlReaderStoredProcedureName |
| 查询超时(分钟) | 查询命令执行的超时,默认值为 120 分钟。 如果为此属性设置了参数,则允许的值是时间跨度,例如“02:00:00”(120 分钟)。 | timespan | 否 | queryTimeout |
| 隔离级别 | 指定 SQL 源的事务锁定行为。 | 读已提交 • 读取未提交 • 可重复读取 • 序列化 •快照 |
否 | isolationLevel: • ReadCommitted • 读未提交 (ReadUncommitted) • RepeatableRead(可重复读) •序列化 •快照 |
| 分区选项 | 用于从 SQL 数据库加载数据的数据分区选项。 | •没有 • 表的物理分区 •动态范围 |
否 | partitionOption: 表的物理分区 • DynamicRange |
| 对于 动态范围 | ||||
| 分区列名称 |
整数或日期/日期时间类型(int、smallint、bigint、date、smalldatetime、datetime、或datetime2、datetimeoffset)的源列名称,用于并行复制的范围分区。 如果未指定,则会自动检测表的索引或主键,并将其用作分区列。 如果使用查询来检索源数据,请在 WHERE 子句中挂接 ?DfDynamicRangePartitionCondition。 |
< 分区列名称 > | 否 | partitionColumnName |
| 分区上限 | 用于分区范围拆分的分区列的最大值。 此值用于确定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 | < 分区上限 > | 否 | partitionUpperBound |
| 分区下限 | 分区范围拆分的分区列的最小值。 此值用于确定分区步幅,不用于筛选表中的行。 将对表或查询结果中的所有行进行分区和复制。 如果未指定,复制活动会自动检测该值。 | < 分区下限 > | 否 | partitionLowerBound 分区下限 |
| 其他列 | 添加更多数据列以存储源文件的相对路径或静态值。 后者支持表达式。 | • 姓名 •价值 |
否 | 附加列: •名字 •价值 |
目的地
| Name | Description | 价值 | 必选 | JSON 脚本属性 |
|---|---|---|---|---|
| 连接 | 与目标数据存储的连接。 | <您的连接 > | 是的 | 连接 |
| 表选项 | 目标数据表。 从使用现有或自动创建表中进行选择。 | • 使用现有 • 自动创建表 |
是的 | 架构 表 |
| 写入行为 | 定义当源文件来自文件型数据存储时的写入行为。 | •插入 • 插入或更新 • 存储过程 |
否 | writeBehavior: • 插入 • 更新插入 • sqlWriterStoredProcedureName |
| 批量插入表锁 | 使用此设置可提高无索引表在多个客户端进行大批量插入操作时的复制性能。 | 是或否(默认值) | 否 | sqlWriterUseTableLock: true 或 false (默认值) |
| 对于 Upsert | ||||
| 使用 TempDB | 是否使用全局临时表或物理表作为进行插入更新操作的临时表。 | 已选择(默认)或未选择 | 否 | useTempDB: true (默认值) 或 false |
| 键列 | 选择用于判断源中的行是否与目标中的行匹配的列。 | < 键列> | 否 | 钥匙 |
| 对于 存储过程 | ||||
| 存储过程名称 | 此属性是从源表读取数据的存储过程的名称。 最后一个 SQL 语句必须是存储过程中的 SELECT 语句。 | < 存储过程名称 > | 否 | sqlWriterStoredProcedureName |
| 复制前脚本 | 在每次运行中将数据写入目标表之前要执行的复制活动的脚本。 可以使用此属性清除预加载的数据。 |
<预复制脚本> (字符串) |
否 | preCopyScript |
| 写入批处理超时 | 超时前等待批插入操作完成的时间。允许的值为 timespan。 默认值为“00:30:00”(30 分钟)。 | timespan | 否 | writeBatchTimeout |
| 写入批大小 | 每次批处理中要插入到 SQL 表中的行数。 默认情况下,该服务根据行大小动态确定适当的批大小。 |
<行数> (整数) |
否 | writeBatchSize (写入批量大小) |
| 最大并发连接数 | 活动运行期间与数据存储建立的并发连接的上限。 仅当想要限制并发连接时,才指定一个值。 |
<并发连接的上限> (整数) |
否 | maxConcurrentConnections |