使用ADF复制活动迁移SQL表时产生多会话的原因咨询
ADF复制活动自动生成多SQL会话的排查原因及解决思路
可能的原因
- SQL驱动默认连接池:ADF使用的SQL驱动(如ODBC、OLEDB)默认启用连接池,即使复制活动未配置并行,驱动会根据数据处理需求自动创建或复用多个连接,从而产生多个SQL会话。
- ADF自动分区读取:针对SQL源,ADF默认会启用自动分区读取(无需手动开启并行)——如果源表有主键或索引,ADF会自动将数据分成多个分区,每个分区用独立连接读取,进而生成多个会话。
- 目标端写入的底层机制:ADF向SQL目标写入数据时,底层可能采用类似批量插入的优化逻辑(如
BULK INSERT的封装),这类操作可能会创建多个会话来提升写入效率,尤其是目标表存在索引、约束时。 - For Each并行与IR资源调度:For Each活动开启并行后,ADF集成运行时(IR)会为每个循环实例分配资源,底层调度可能会复用或创建多个连接,即使单个复制活动未配置并行,也会叠加产生多会话。
- SQL数据库自身行为:比如数据库启用了
READ COMMITTED SNAPSHOT隔离级别,或后台自动统计信息更新、索引维护等操作,可能会与复制活动的会话叠加,但这类情况通常是临时的。
排查与验证步骤
- 检查复制活动源分区配置:进入复制活动的「源」选项卡,查看「分区选项」是否为「自动」或基于列分区,改为「无」后重新运行任务,观察会话数变化。
- 调整数据源连接池参数:在SQL数据源的连接字符串中添加/修改
Max Pool Size=1参数,限制连接池最大连接数,测试是否能减少会话数量。 - 检查集成运行时配置:如果使用自托管IR,查看其「并发执行数」设置,适当调低后观察会话变化;托管IR则检查ADF默认的资源调度限制。
- 分析ADF诊断日志:启用复制活动的诊断日志,查看
DataSourceConnection相关日志条目,确认每个连接的创建原因(如分区读取、连接池复用等)。 - SQL端会话查询:在SQL数据库中执行以下查询,定位会话来源及操作:
通过SELECT session_id, program_name, host_name, login_name, status, command FROM sys.dm_exec_sessions WHERE program_name LIKE '%Azure Data Factory%'command字段判断会话是读取还是写入操作,进一步定位根源。
内容的提问来源于stack exchange,提问作者kshitiz sinha
相关产品推荐
相关产品推荐

