本文概述了如何使用管道中的复制活动从 Azure SQL 托管实例复制数据。
支持的配置
有关复制活动下每个选项卡的配置,请分别转到以下部分。
常规
请参阅 常规 设置 指南,以配置 常规 设置选项卡。
源
复制活动的“源”选项卡下的 Azure SQL 托管实例支持以下属性。
以下属性是必需的:
连接:从连接列表中选择 Azure SQL 托管实例连接。 如果连接不存在,请选择 新建以创建 Azure SQL 托管实例的新连接。
连接类型:选择 Azure SQL 托管实例。
使用查询:指定读取数据的方式。 可以选择 表、查询或 存储过程。 以下列表描述了每个设置的配置:
表:从指定的表读取数据。 从下拉列表中选择源表,或选择“编辑”以手动输入。
查询:指定要读取数据的自定义 SQL 查询。 例如
select * from MyTable。 或选择铅笔图标以在代码编辑器中进行编辑。显示查询设置的
存储过程:使用存储过程从源表读取数据。 最后一个 SQL 语句必须是存储过程中的 SELECT 语句。
存储过程名称:选择存储过程或在选择 编辑 以从源表读取数据时手动指定存储过程名称。
存储过程参数:指定存储过程参数的值。 允许的值是名称或值对。 参数的名称和大小写必须与存储过程参数的名称和大小写匹配。 可以选择 导入参数 来获取存储过程参数。
在“高级”下,可以指定以下字段:
查询超时(分钟):指定查询命令执行的超时,默认值为 120 分钟。 如果为此属性设置了参数,则允许的值是时间跨度,例如“02:00:00”(120 分钟)。
隔离级别:指定 SQL 源的事务锁定行为。 允许的值包括:“读取已提交项”、“读取未提交项”、“可重复读取”、“可序列化”或“快照”。 如果未指定,则使用数据库的默认隔离级别。 有关更多详细信息,请参阅 IsolationLevel Enum。
分区选项:指定用于从 Azure SQL 托管实例加载数据的数据分区选项。 允许的值为:无(默认值),表的物理分区,以及 动态范围。 启用分区选项(即,不是 None),从 Azure SQL 托管实例并发加载数据的并行度由复制活动设置选项卡中 复制并行度 控制。
无:选择此设置以不使用分区。
表的物理分区:使用物理分区时,将根据物理表定义自动确定分区列和机制。
动态范围:使用启用了并行的查询时,需要范围分区参数(
?DfDynamicRangePartitionCondition)。 示例查询:SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition。分区列名称:指定用于并行复制中范围分区的源列名称,该列属于 整数或日期/时间 类型(
int、smallint、bigint、date、smalldatetime、datetime、datetime2或datetimeoffset)。 如果未指定,则会自动检测表的索引或主键,并将其用作分区列。如果使用查询来检索源数据,请在 WHERE 子句中使用
?DfDynamicRangePartitionCondition。 有关示例,请参阅 Azure SQL 托管实例 部分中 并行复制。分区上限:指定分区范围拆分的分区列的最大值。 此值用于确定分区步幅,不用于筛选表中的行。 表或查询结果中的所有行都将进行分区和复制。 如果未指定,复制活动会自动检测该值。 有关示例,请参阅 Azure SQL 托管实例 部分中 并行复制。
分区下限:指定分区范围拆分的分区列的最小值。 此值用于确定分区步幅,不用于筛选表中的行。 表或查询结果中的所有行都将进行分区和复制。 如果未指定,复制活动会自动检测该值。 有关示例,请参阅 Azure SQL 托管实例 部分中 并行复制。
其他列:添加其他数据列以存储源文件的相对路径或静态值。 后者支持表达式。
请注意以下几点:
- 如果为源指定了 查询,复制活动将针对 Azure SQL 托管实例源运行此查询以获取数据。 还可以通过指定 存储过程名称 和 存储过程参数来指定存储过程(如果存储过程采用参数)。
- 在源中使用存储过程检索数据时,请注意,如果您的存储过程被设计为在传入不同的参数值时返回不同的架构,则在从 UI 导入架构或将数据复制到 SQL 数据库(具有自动表创建功能)时,可能会遇到错误或看到意外的结果。
目的地
复制活动的“目标”选项卡下的 Azure SQL 托管实例支持以下属性。
以下属性是必需的:
连接:从连接列表中选择 Azure SQL 托管实例连接。 如果连接不存在,请选择 新建以创建 Azure SQL 托管实例的新连接。
连接类型:选择 Azure SQL 托管实例。
表选项:可以选择 使用现有 来使用指定的表。 或者选择 自动创建表 在源架构中不存在该表时自动创建目标表,请注意,当存储过程用作写入行为时不支持此选择。
如果选择 使用现有:
- 表:从下拉列表中选择目标数据库中的表。 或选中“编辑”以手动输入表名称。
如果选择:自动创建表:
- 表:指定自动创建的目标表的名称。
在“高级”下,可以指定以下字段:
写入行为:定义源文件来自基于文件的数据存储时的写入行为。 可以选择“插入”、“**更新插入”或“存储过程”。
插入:选择此选项使用插入写入行为将数据加载到 Azure SQL 托管实例中。
Upsert:选择此选项使用 upsert 写入行为将数据加载到 Azure SQL 托管实例中。
使用 tempdb:指定是使用全局临时表还是物理表作为更新插入的临时表。 默认情况下,该服务使用全局临时表作为临时表,并且已选择此属性。
选择用户数据库架构:如果未选择 使用 TempDB,请指定临时架构,以便在使用物理表时创建临时表。
注意
必须具有创建和删除表的权限。 默认情况下,临时表将共享与目标表相同的架构。
关键列:指定用于唯一行标识的列名称。 可以使用单个键或一系列密钥。 如果未指定,则使用主键。
存储过程:使用存储过程定义如何将源数据应用于目标表。 此存储过程是按批调用的。 对于仅运行一次且与源数据无关的操作(例如“删除”或“截断”),请使用预复制脚本的 属性。
存储过程名称:在选中“编辑”以从源表读取数据时,选择存储过程或手动指定存储过程名称。
存储过程参数:
- 表类型:指定要在存储过程中使用的表类型名称。 复制活动使数据在具有此表类型的临时表中可用。 然后,存储过程代码可以将正在复制的数据与现有数据合并。
- 表类型参数名称:指定存储过程中指定的表类型的参数名称。
- 参数:指定存储过程参数的值。 允许的值是名称或值对。 参数的名称和大小写必须与存储过程参数的名称和大小写匹配。 可以选择 导入参数 来获取存储过程参数。
批量插入表锁:选择“是”或“否”(默认值)。 使用此设置可以在多个客户端对无索引表进行大容量插入操作时提高复制性能。 选择“插入”或“更新插入”作为写入行为时,可以指定此属性。 有关详细信息,请转到 BULK INSERT (Transact SQL)
预复制脚本:指定要在每次运行中将数据写入目标表之前要执行的复制活动的脚本。 可以使用此属性来清理预加载的数据。
写入批处理超时:指定批处理插入操作在超时之前完成的等待时间。允许的值为时间跨度。 如果未指定任何值,则超时默认为“02:00:00”。
写入批大小:指定要在每个批的 SQL 表中插入的行数。 允许的值为整数(行数)。 默认情况下,服务会根据行大小动态确定相应的批大小。
最大并发连接:活动运行期间与数据存储建立的并发连接上限。 仅当想要限制并发连接时,才指定一个值。
映射
对于“映射”选项卡配置,如果不应用以自动创建表为目标的 Azure SQL 托管实例,请转到“映射”。
如果您将 Azure SQL 托管实例与自动创建表功能一起用作目标,除了 映射中的配置之外,您可以编辑目标列的类型。 选择 导入架构后,可以在目标中指定列类型。
例如,源中 ID 列的类型为 int,当映射到目标列时,你可以将其更改为浮动类型。
设置
对于“设置”选项卡配置,请转到“设置”选项卡下的“配置其他设置”。
从 Azure SQL 托管实例进行并行复制
复制活动中的 Azure SQL 托管实例连接器提供内置的数据分区来并行复制数据。 可以在复制活动的 源 选项卡上找到数据分区选项。
启用分区复制时,复制活动针对 Azure SQL 托管实例源运行并行查询,按分区加载数据。 并行度由复制活动设置选项卡中的 复制并行度 控制。例如,如果将 复制并行度 设置为 4,则服务会根据指定的分区选项和设置同时生成并运行四个查询,并且每个查询从 Azure SQL 托管实例检索一部分数据。
建议使用数据分区启用并行复制,尤其是在从 Azure SQL 托管实例加载大量数据时。 下面是针对不同方案的建议配置。 将数据复制到基于文件的数据存储中时,建议以多个文件的形式写入文件夹(仅指定文件夹名称),在这种情况下,性能优于写入单个文件。
| 方案 | 建议的设置 |
|---|---|
| 从包含物理分区的大型表进行完整加载。 |
分区选项:表的物理分区。 在执行期间,服务会自动检测物理分区,并按分区复制数据。 要检查表是否包含物理分区,可参阅此查询。 |
| 从大型表中进行完全数据加载(没有物理分区),同时使用整数或日期时间列进行数据分区。 |
分区选项:动态范围分区。 分区列(可选):指定用于对数据进行分区的列。 如果未指定,则使用索引或主键列。 分区上限 和 分区下限(可选):指定是否要确定分区步幅。 这不适用于筛选表中的行,表中的所有行都将进行分区和复制。 如果未指定,复制活动会自动检测值。 例如,如果分区列“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”为“是”,如下所示。
表摘要
有关 Azure SQL 托管实例复制活动的摘要和详细信息,请参阅下表。
源信息
| 名字 | 描述 | 价值 | 必选 | JSON 脚本属性 |
|---|---|---|---|---|
| 连接 | 与源数据存储的连接。 | < 你的连接 > | 是的 | 连接 |
| 连接类型 | 你的连接类型。 选择 Azure SQL 托管实例。 | Azure SQL 托管实例 | 是的 | / |
| 使用查询 | 用于读取数据的自定义 SQL 查询。 | •表格 • 查询 • 存储过程 |
是的 | / |
| 表 | 你的源数据表。 | < 表的名称> | 不 | 图式 表 |
| 查询 | 用于读取数据的自定义 SQL 查询。 | < 你的查询 > | 不 | sqlReaderQuery |
| 存储过程名称 | 此属性是从源表读取数据的存储过程的名称。 最后一个 SQL 语句必须是存储过程中的 SELECT 语句。 | < 存储过程名称 > | 不 | sqlReaderStoredProcedureName |
| 存储过程参数 | 这些参数适用于存储过程。 允许的值是名称或值对。 参数的名称和大小写必须与存储过程参数的名称和大小写匹配。 | < 名称或值对 > | 不 | storedProcedureParameters |
| 查询超时 | 查询命令执行的超时。 | 时间跨度 (默认值为 120 分钟) |
不 | queryTimeout |
| 隔离级别 | 指定 SQL 源的事务锁定行为。 | • 读取已提交项 • 读取未提交项 • 可重复读取 • 可序列化 •快照 |
不 | isolationLevel: • ReadCommitted(已提交读) • 读未提交 (ReadUncommitted) • RepeatableRead(可重复读) • 可序列化 •快照 |
| 分区选项 | 用于从 Azure SQL 托管实例加载数据的数据分区选项。 | • 无(默认值) • 表的物理分区 • 动态范围 |
不 | 分区选项: • 无(默认值) 表的物理分区 • DynamicRange |
| 分区列名称 |
整数类型、日期类型或日期/时间类型(int、smallint、bigint、date、smalldatetime、datetime、datetime2 或 datetimeoffset)的源列的名称,由范围分区用于并行复制。 如果未指定,则会自动检测表的索引或主键,并将其用作分区列。 如果使用查询来检索源数据,请在 WHERE 子句中使用 ?DfDynamicRangePartitionCondition。 |
< 分区列名称 > | 不 | partitionColumnName |
| 分区上限 | 用于分区范围拆分的分区列的最大值。 此值用于确定分区步幅,不用于筛选表中的行。 表或查询结果中的所有行都将进行分区和复制。 如果未指定,复制活动会自动检测该值。 | < 你的分区上限 > | 不 | partitionUpperBound |
| 分区下限 | 用于分区范围拆分的分区列的最小值。 此值用于确定分区步幅,不用于筛选表中的行。 表或查询结果中的所有行都将进行分区和复制。 如果未指定,复制活动会自动检测该值。 | < 你的分区下限 > | 不 | partitionLowerBound |
| 其他列 | 添加其他数据列以存储源文件的相对路径或静态值。 后者支持表达式。 | •名字 •价值 |
不 | additionalColumns: •名字 •价值 |
目的地信息
| 名字 | 描述 | 价值 | 必选 | JSON 脚本属性 |
|---|---|---|---|---|
| 连接 | 与目标数据存储的连接。 | < 你的连接 > | 是的 | 连接 |
| 连接类型 | 你的连接类型。 选择 Azure SQL 托管实例。 | Azure SQL 托管实例 | 是的 | / |
| 表选项 | 指定如果目标表不存在,是否根据源架构自动创建。 | • 使用现有 • 自动创建表 |
是的 | tableOption: • “autoCreate” |
| 表 | 你的目标数据表。 | <表的名称> | 是的 | 图式 表 |
| 写入行为 | 用于将数据加载到 Azure SQL 托管实例数据库的复制活动的写入行为。 | • 插入 • 更新插入 • 存储过程 |
不 | writeBehavior: • 插入 • 更新插入 sqlWriterStoredProcedureName、sqlWriterTableType、storedProcedureTableTypeParameterName、storedProcedureParameters |
| 使用 TempDB | 是使用全局临时表还是物理表作为更新插入的临时表。 | 已选择(默认)或未选择 | 不 | useTempDB: true (默认值) 或 false |
| 选择用户数据库架构 | 使用物理表时用于创建临时表的临时架构。 注意:用户需要具有创建和删除表的权限。 默认情况下,临时表将共享与目标表相同的架构。 如果未选择“使用 TempDB”,则适用。 | 已选择(默认)或未选择 | 不 | interimSchemaName |
| 键列 | 唯一行标识的列名称。 可以使用单个键或一系列密钥。 如果未指定,则使用主键。 | < 键列> | 不 | 钥匙 |
| 存储过程名称 | 定义如何将源数据应用于目标表的存储过程的名称。 此存储过程是按批调用的。 对于仅运行一次且与源数据无关的操作,请使用 预复制脚本 属性,例如删除或截短。 | < 您的存储过程名称 > | 不 | sqlWriterStoredProcedureName |
| 表类型 | 要用于存储过程的表类型名称。 复制活动使数据在具有此表类型的临时表中可用。 然后,存储过程代码可以将正在复制的数据与现有数据合并。 | < 您的表类型名称 > | 不 | sqlWriterTableType |
| 表类型参数名称 | 存储过程中指定的表类型的参数名称。 | < 表类型的参数名称 > | 不 | storedProcedureTableTypeParameterName |
| 参数 | 存储过程的参数。 允许的值是名称和值对。 参数的名称和大小写必须与存储过程参数的名称和大小写匹配。 | < 名称和值对 > | 不 | storedProcedureParameters |
| 批量插入表锁 | 使用此设置可以在多个客户端对无索引表进行大容量插入操作时提高复制性能。 | 是或否(默认值) | 不 | sqlWriterUseTableLock: true 或 false (默认值) |
| 复制前脚本 | 在每次运行中将数据写入目标表之前要执行的复制活动的脚本。 可以使用此属性来清理预加载的数据。 |
< 复制前脚本 > (字符串) |
不 | preCopyScript |
| 写入批处理超时 | 超时前等待批插入操作完成的时间。 | 时间跨度 (默认值为“02:00:00”) |
不 | writeBatchTimeout |
| 写入批大小 | 每批要插入到 SQL 表中的行数。 默认情况下,服务会根据行大小动态确定相应的批大小。 |
< 行数 > (整数) |
不 | writeBatchSize |
| 最大并发连接数 | 活动运行期间与数据存储建立的并发连接的上限。 仅当想要限制并发连接时,才指定一个值。 |
< 并发连接上限 > (整数) |
不 | maxConcurrentConnections (最大并发连接数) |